Вредна ли буферизация файлов ОС? - PullRequest
4 голосов
/ 11 сентября 2009

Я написал библиотеку загрузок для моего коллеги. Записывает загруженные данные в файлы.

Мои коллеги обнаружили, что файл долго остается маленьким, даже если загружено 100 Мб данных.

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

Но я не думаю, что 100 МБ виртуальной памяти - это много, и думаю, что, возможно, у Windows есть причина для буферизации такого большого количества данных.

Что вы думаете об этом?

Ответы [ 5 ]

4 голосов
/ 11 сентября 2009

Я бы поверил, что операционная система настроена соответствующим образом, лично.

Что касается «немедленной очистки, чтобы не потерять данные в случае отключения питания» - если питание отключается на полпути через файл, поверите ли вы, что записанные вами данные были в порядке, и возобновите загрузку оттуда? Если это так, возможно стоит сбросить пораньше - но я бы взвесил сложность возобновления против относительной редкости сбоев питания и просто закрыл файл, когда прочитал все. Если вы видите наполовину написанный файл, удалите его и загрузите снова с нуля.

4 голосов
/ 11 сентября 2009

Ну, сначала вы должны исследовать / отладить происходящее. Проблема может быть в другом месте; Например, проводник Windows может не обновлять размер файла достаточно быстро.

Тем не менее, вы правы, обычно, если система виртуальных машин ОС решает буферизовать содержимое в ОЗУ, у нее есть веская причина для этого, и вы не должны вмешиваться. Если свободной памяти много, то все-таки имеет смысл ее использовать.

2 голосов
/ 11 сентября 2009

Очистка через определенные интервалы / размеры / строки может быть лучше, чем очистка для каждой записи. Это помогает уменьшить объем используемой памяти, а также обеспечивает периодическое обновление фактического файла информацией. Например, вы можете очищать каждые 100 строк.

2 голосов
/ 11 сентября 2009

Если бы это был я, я бы хотел, чтобы все данные были сохранены в энергонезависимой папке как можно скорее. Я определенно очистил бы потоки, чтобы убедиться, что я ничего не потерял в случае сбоя питания. Вы не указали, есть ли необходимость в доступе к данным позже, но я предполагаю, что есть, иначе зачем вам их хранить? Однако, чтобы ответить на оригинальный вопрос - это не «вредно» для ОС, но вы рискуете потерять данные.

0 голосов
/ 11 сентября 2009

Если есть способы уменьшить требования к памяти при незначительном влиянии на производительность, я бы предпочел менее жадную версию. Возможно, мне понадобится эта память для чего-то более важного, а объем загрузочного пространства в 100 МБ достаточно велик для загрузчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...