Ruby的CSV.open是否会缓存到内存并一次性写入全部内容?

11
< p > < code > CSV.open 在块退出时会将数据存储在内存中并一次性写入文件吗?还是会自动分批写入?

require 'csv'

CSV.open('result.csv', 'wb') do |csv|
  while row = next_row
    csv << row
  end
end

2
我通过运行CSV.open('foo', 'wb') {|x| loop { x << [1,2,3] ; sleep 0.001 } }并在另一个 shell 中监视foo文件的大小来进行测试。每隔约3秒钟,缓冲区就会填满8196字节并写入磁盘。 - user513951
1个回答

16

CSV.open 在块结束时会将数据写入操作系统,并在缓冲区填满并被刷新时自动写入(在我的 Ruby 安装中,它会在 8196 字节时触发自动刷新)。您也可以在块内添加csv.flush,以强制顺序写入。

require 'csv'

CSV.open('result.csv', 'wb') do |csv|
  while row = next_row
    csv << row  # Without flush, writes to underlying OS only when buffer fills
    csv.flush   # Adding this forces a write to underlying OS
  end
end             # Exiting block writes to underlying OS and closes file handle

(请注意,写入的内容是针对底层操作系统的,可能会在实际写入磁盘之前再次缓存流。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接