Ruby -批量读取文件

dzjeubhm  于 11个月前  发布在  Ruby
关注(0)|答案(4)|浏览(125)

我正在阅读一个10mb大小的文件,其中包含一些id。我将它们读入ruby中的一个列表中。我担心这可能会在将来导致内存问题,当文件中id的数量可能会增加时。是否有一种有效的方法来批量阅读一个大文件?
谢谢你

sshcrbum

sshcrbum1#

有了Lazy Enumerators和each_slice,你可以两全其美,不用担心中间剪线,还可以一次批处理多条线,batch_size可以自由选择。

header_lines = 1
batch_size   = 2000

File.open("big_file") do |file|
  file.lazy.drop(header_lines).each_slice(batch_size) do |lines|
    # do something with batch of lines
  end
end

字符串
它可以用来将一个巨大的CSV文件导入数据库:

require 'csv'
batch_size   = 2000

File.open("big_data.csv") do |file|
  headers = file.first
  file.lazy.each_slice(batch_size) do |lines|
    csv_rows = CSV.parse(lines.join, headers: headers)
    # do something with 2000 csv rows, e.g. bulk insert them into a database
  end
end

8gsdolmq

8gsdolmq2#

没有通用的方法。
1)你可以按块读取文件:

File.open('filename','r') do |f|
  chunk = f.read(2048)
  ...
end

字符串

**缺点:**你可能会错过一个子串,如果它在块之间,即你寻找“SOME_TEXT”,但“SOME_”是第一个2048字节块的最后5个字节,而“TEXT”是第二个块的4个字节

2)你可以逐行读取文件

File.open('filename','r') do |f|
  line = f.gets
  ...
end

**缺点:**这种方法比第一种方法慢2倍..5倍

vptzau2j

vptzau2j3#

基于@ EricDuminil的答案,CSV类也直接支持惰性枚举器。

require 'csv'
batch_size   = 2000

csv = CSV.open("big_data.csv", headers: true)
csv.lazy.each_slice(batch_size) do |csv_rows|
  # do something with 2000 csv rows, e.g. bulk insert them into a database
end

字符串
这种方法的好处是我们可以获得已经解析过的CSV行。

xxhby3vn

xxhby3vn4#

如果你这么担心速度/内存效率,你有没有考虑过 shell 和使用grepawksed等?如果我知道更多关于输入文件的结构和你试图提取的内容,我可能会为你构建一个命令。

相关问题