Постоянная запись в файл против сохранения данных в массиве и запись в файл одновременно - PullRequest
0 голосов
/ 03 июля 2018

Я работаю в c # и в своей программе я в данный момент открываю поток файлов при запуске и записываю в него данные в формате csv примерно каждую секунду. Мне интересно, будет ли эффективнее хранить эти данные в массиве списков и записывать их все сразу в конце, или продолжать сохранять открытый файловый поток и просто записывать данные каждую секунду?

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Этот вид зависит от вашего конкретного случая. Если вы пишете данные примерно раз в секунду, то, скорее всего, вы не увидите значительного влияния прямой записи.

В общем случае запись в FileStream небольшими кусочками довольно производительна, потому что .NET Framework и ОС обрабатывают буферизацию для вас. Сам файл не будет обновляться, пока буфер не заполнится или вы явно не очистите поток.

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

Если вы беспокоитесь о производительности, используйте ветку регистрации. Публикуйте объекты на него через ConcurrentQueue<> или аналогичный и делайте все записи в отдельном потоке. Очевидно, что многопоточное журналирование является более сложным. Это не то, что я бы посоветовал, если вы действительно действительно не нуждаетесь в дополнительной производительности.

Для быстрой и грязной регистрации я обычно просто использую File.AppendAllText() или File.AppendAllLines(), чтобы вытолкнуть данные. Это займет немного больше времени, но это довольно надежно. И я могу прочитать вывод, пока программа еще работает, что часто бывает полезно.

0 голосов
/ 03 июля 2018

Если объем данных «разумно управляем» в памяти, запишите данные в конец.

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

0 голосов
/ 03 июля 2018

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

Вы можете узнать больше о том, почему большинство языков используют этот подход здесь https://unix.stackexchange.com/questions/224415/whats-the-philosophy-behind-delaying-writing-data-to-disk

0 голосов
/ 03 июля 2018

Вам следует рассмотреть возможность использования BufferedStream . Запишите в поток и дайте фреймворку записать в файл при необходимости. Обязательно промойте поток перед его закрытием.

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