Подход к обработке массива: оптом или в розницу?

roman-us

Какой подход больше соответствует хорошему тону: получить массив из 2000 строк(заполнив оперативку) и записать его в файл одной операцией или каждую из 2000 строк последовательно записывать в файл?

Dasar

хороший тон - писать по одной через буферизированный stream

lubanj

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

Dasar

>еще лучший тон наверное считывать не посрочно, а "побуферно". причем с буфером нужного хитрого размера (выравнивания и все такое)
считывать тоже лучше по одной через буферизированный stream

lubanj

а в чем профит? поясни

Dasar

>а в чем профит? поясни
логика - процесс обработки, не смешивается с физикой - буферизацией

dangerr

А разве о физике не система должна заботиться?

cat /proc/sys/vm/dirty_writeback_centisecs
500

Serab

ну хз, как-то нашел в тестирующем коде функцию, которая считывала файл в холостую (ну чтобы как раз все эти системные кэши заставить его запомнить, ну так, на всякий случай так вот, при считывании поблочно блоками в несколько килобайт получается заметно быстрее, чем при побайтном (так было раньше).

erotic

cat /proc/sys/vm/dirty_writeback_centisecs 500
Теплое... Мягкое... какая в жопу разница.

dangerr

При чтении логично, что так.... этот параметр к записи относится.

dangerr

Я ж и не утверждаю, что я тут знаю больше других. Это вообще-то вопрос был. Поясни уж почему тёплое и мягкое. По мне так это параметр, отвечающий за периодичность реального сброса данных на диск, которые с точки зрения прикладной программы уже записаны. То есть тот самый буфер.

erotic

Вообще тред развалился на хороший тон и на профиты :)
Профита от твоей настройки я не вижу ни при каком ее значении. Если ты пишешь много данных быстро, то сначала упрешься в заполнение дискового кэша ОС, которая сразу станет сбрасывать данные на диск, не принимая новые данные для записи, и ты тупо упрешься в скорость диска. А если ты пишешь данные не быстро, не заполняя буфер, то тебе должно быть все равно, когда они реально попадут на диск.
Т.е. если задача быстро скинуть данные на диск и забыть, то тут разве что буфер ОС можно увеличить, чтобы все сразу влезло, а потом пусть ОС разбирается, когда на диск пихнуть.
А софтовый stream буфер дает профит в том, что ты работаешь чисто со строками, не мучаясь памятью и заполнением/очищением буфера. При этом буфер дает профит в том, что ты реже вызываешь системные вызовы write, которые могут создавать основное торможение.
Наверное ты слово "физика" слишком буквально воспринял :)

slonishka

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

dangerr

Да уж, под физикой я как-то понял только непосредственную запись на диск, забыв о том, что вызов write - не простой вызов функции. :) Спасибо обоим за пояснения.
Оставить комментарий
Имя или ник:
Комментарий: