簡體   English   中英

Ruby - 批量讀取文件

[英]Ruby - Read file in batches

我正在讀取一個 10mb 大小的文件,其中包含一些 ID。 我將它們讀入 ruby​​ 列表。 我擔心將來可能會導致內存問題,因為文件中的 id 數量可能會增加。 有沒有有效的批量讀取大文件的方法?

謝謝

使用Lazy Enumeratorseach_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 並使用grepawksed等? 如果我對輸入文件的結構以及您要提取的內容有更多了解,我可能會為您構建一個命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM