1

我在数百万行中有非常大的文件,我想将它们插入数据库,但我无法同时创建或导入,因为它会阻塞 db 并占用大量内存。所以,我想让从 csv 文件读取索引到索引的工作(例如,第一个工作读取 0 到 1000 行,其他工作读取 1000 到 2000 行)但我认为 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
}
4

1 回答 1

0

您可以使用Smarter CSV轻松完成

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
于 2019-02-02T02:37:17.530 回答