[英]Ruby - Read file in batches
我正在讀取一個 10mb 大小的文件,其中包含一些 ID。 我將它們讀入 ruby 列表。 我擔心將來可能會導致內存問題,因為文件中的 id 數量可能會增加。 有沒有有效的批量讀取大文件的方法?
謝謝
使用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
沒有通用的方法。
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
缺點:這樣它會比第一種方法慢 2x..5x
如果您非常擔心速度/內存效率,您是否考慮過使用 shell 並使用grep
、 awk
、 sed
等? 如果我對輸入文件的結構以及您要提取的內容有更多了解,我可能會為您構建一個命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.