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
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
4条答案
按热度按时间sshcrbum1#
有了Lazy Enumerators和each_slice,你可以两全其美,不用担心中间剪线,还可以一次批处理多条线,
batch_size
可以自由选择。字符串
它可以用来将一个巨大的CSV文件导入数据库:
型
8gsdolmq2#
没有通用的方法。
1)你可以按块读取文件:
字符串
**缺点:**你可能会错过一个子串,如果它在块之间,即你寻找“SOME_TEXT”,但“SOME_”是第一个2048字节块的最后5个字节,而“TEXT”是第二个块的4个字节
2)你可以逐行读取文件
型
**缺点:**这种方法比第一种方法慢2倍..5倍
vptzau2j3#
基于@ EricDuminil的答案,CSV类也直接支持惰性枚举器。
字符串
这种方法的好处是我们可以获得已经解析过的CSV行。
xxhby3vn4#
如果你这么担心速度/内存效率,你有没有考虑过 shell 和使用
grep
,awk
,sed
等?如果我知道更多关于输入文件的结构和你试图提取的内容,我可能会为你构建一个命令。