запись в файл произвольного доступа в Erlang - PullRequest
2 голосов
/ 29 октября 2010

Как записать файл после получения определенного количества данных?

Я знаю, что файл можно открыть, а затем записать в файл file: pwrite (Position, Bin).

Я хотел бы знать, что данные, например, загружаются и должны быть записаны в файл.Как это сделать эффективно?например, использование буфера (как записывается буфер?)

Кроме того, файл остается открытым все время до завершения загрузки, или он открывается каждый раз, когда достигается буфер и данные должны быть записаны?

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 октября 2010

Если вы хотите, чтобы erlang позаботился о буферизации файловых записей, вы можете открыть файл с параметром {delayed_write, Size, Delay}.Тогда вы можете просто набрать io:write столько, сколько захотите, и виртуальная машина позаботится о пакетировании этих запросов в один вызов записи ОС, когда буфер достигнет Size байтов или после Delay миллисекунд, так как буфер начал заполняться.

Этот подход позволит вам совершать io:write вызовы каждый раз, когда вы получаете данные из сети, но знаете, что вы не будете отправлять системные вызовы для каждого байта (если у вас действительно патологическое поведение сети).

1 голос
/ 29 октября 2010

Самый эффективный метод - добавить данные в буфер в памяти (список ввода-вывода?) И записать их в файл за одну операцию.Если вы хотите открыть файл и записать каждый блок данных по мере его поступления, вы можете открыть файл в режиме append:

> file:write_file(FileName, DataToWrite, [append]).

Каждая запись добавляет данные в конец файла..

0 голосов
/ 29 октября 2010

Я думаю file:pwrite/3 имеет то, что вам нужно.

...