Ruby on rails 从给定索引到rails中的索引读取csv文件

Ruby on rails 从给定索引到rails中的索引读取csv文件,ruby-on-rails,ruby,csv,rubygems,Ruby On Rails,Ruby,Csv,Rubygems,我有数百万行的巨大文件,我想将它们插入数据库,但我无法同时创建或导入,因为它会阻塞数据库并占用大量ram。所以,我想让从csv文件中读取索引到索引的作业(例如,第一个作业读取0到1000行,其他作业读取1000到2000行,就像wise一样),但我认为csv.foreach没有这种功能,我不能在作业参数中发送1000行数据,也不能在每个作业中打开此文件。所以,请引导我 在获得文件路径后,我读取了所有行(假设为100万行),并将其划分为1000个作业,在每个作业中,我给出了作业必须从中开始读取的文

我有数百万行的巨大文件,我想将它们插入数据库,但我无法同时创建或导入,因为它会阻塞数据库并占用大量ram。所以,我想让从csv文件中读取索引到索引的作业(例如,第一个作业读取0到1000行,其他作业读取1000到2000行,就像wise一样),但我认为csv.foreach没有这种功能,我不能在作业参数中发送1000行数据,也不能在每个作业中打开此文件。所以,请引导我

在获得文件路径后,我读取了所有行(假设为100万行),并将其划分为1000个作业,在每个作业中,我给出了作业必须从中开始读取的文件路径和索引。 在每项工作中

def perform(file_name, index){

    CSV.foreach(file_name, :headers => true) do |row| # want to start with index*1000 
        hash = row.to_hash
        if if i>= index*1000 + 1000
             Table.import arr_hash
             arr_hash = []
             break if i>= index*1000 + 1000
        end
        arr_hash<<Table.new(hash)
    end
    if arr_hash
      Table.import arr_hash
    end
}
def-perform(文件名、索引){
CSV.foreach(文件名:headers=>true)是否要以索引*1000开头
散列=行到散列
如果i>=索引*1000+1000
表1.1导入arr\u哈希
arr_hash=[]
如果i>=索引*1000+1000,则中断
结束

arr_hash使用


您可以通过使用


欢迎来到stackoverflow社区。您能展示一些代码或您迄今为止对您的问题所做的研究吗?请查看问题中的更改您可以查看使用Enumerator::Lazy的文件类。然后使用CSV::Row处理行。这只是一个想法☺️欢迎来到stackoverflow社区。您能展示一些代码或您迄今为止对您的问题所做的研究吗?请查看问题中的更改您可以查看使用Enumerator::Lazy的文件类。然后使用CSV::Row处理行。这只是一个想法☺️我认为这不起作用,因为我想在插入行之前验证数据,并且我正在生成作业来处理行块,所以建议使用索引到索引。感谢您的支持help@Tell_404_not_today您提到“例如,第一个作业读取0到1000行,其他作业读取1000到2000行”在上面的代码中,第一个区块将用于第一个作业运行0到2000行,下一个区块将用于下一个作业运行2000到4000行。这正是您想要的,对吗?对不起,我的区块大小为2000,但您可以将其更改为1000@tkhuynh,根据我理解您的答案,实际上我无法在j中给出1000行的区块ob,因为它的参数太大。所以,我必须给出文件路径并根据索引到索引读取行。我认为这不起作用,因为我想在插入行之前验证数据,并且我正在生成作业来处理行块,所以建议使用索引到索引。感谢help@Tell_404_not_today你提到例如,第一个作业读取0到1000行,其他作业读取1000到2000行"在上面的代码中,第一个区块将用于第一个作业运行0到2000行,下一个区块将用于下一个作业运行2000到4000行。这正是您想要的,对吗?对不起,我的区块大小为2000,但您可以将其更改为1000@tkhuynh,根据我理解您的答案,实际上我无法在j中给出1000行的区块因为参数太大了。所以,我必须给出文件路径,并根据索引到索引读取行。
SmarterCSV.process('csv_file_path', {:col_sep => ",", :force_utf8 => true, :chunk_size => 1000}) do |chunk|
  # process your chunk here
  # assign each chunk to a Job to process 1000 rows per job
end