2015-12-09 3 views
4

Будет ли CSV.open хранить данные в памяти и записывать в файл один раз, когда блок выходит, или он будет автоматически записываться многими партиями?Сохраняет ли буфер Ruby CSV.open в памяти и записывает все сразу?

require 'csv' 

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

Я испытал это, запустив 'CSV.open («Foo»,«ББ ') {| x | цикл {x << [1,2,3]; sleep 0.001}} ') и посмотреть размер файла' foo' в другой оболочке. Каждые ~ 3 секунды буфер заполняется 8196 байтами и записывается на диск. –

ответ

5

CSV.open будет записывать в основной ОС, когда блок закрывается, и он также будет писать каждый раз, когда буфер заполняется и очищается, что будет происходить автоматически. (В моей установке Ruby это происходит с 8196 байтами.) Вы также можете добавить csv.flush в свой блок, чтобы заставить его писать последовательно.

require 'csv' 

CSV.open('result.csv', 'wb') do |csv| 
    while row = next_row 
    csv << row # Writes to underlying OS only when buffer fills 
    csv.flush # Forces write to underlying OS 
    end 
end    # Writes to underlying OS and closes file handle 

(Обратите внимание, что записи являются основной ОС, которая может буфер поток снова до фактического записи на диск.)