2010-10-28 3 views
2

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

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

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

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

Благодаря

ответ

2

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

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

1

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

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

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

Смежные вопросы