Ruby – 批量读取文件

我正在读一个10mb大小的文件,其中包含一些id。 我把它们读成ruby列表。 我担心将来可能会导致内存问题,因为文件中的id数量可能会增加。 是否有批量读取大文件的有效方法?

谢谢

没有通用的方法。

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倍

使用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, write_headers: true, headers: headers) # do something with 2000 csv rows, eg bulk insert them into a database end end