Как предотвратить фрагментацию файлов на жестком диске файлов журнала
Я написал программу сбора данных на C# с использованием.NET, которая собирает данные с портов USB. Программа записывает необработанные данные на жесткий диск, а также обрабатывает данные в режиме онлайн (анализирует их) и также записывает результаты на жесткий диск. (Он только пишет данные, он никогда не читает.)
Программа работает несколько дней и недель без перерыва, но в будущем будет необходимо запустить ее несколько месяцев; Файлы журнала (необработанные данные + результаты) становятся все больше и больше: через 15 дней общий размер составляет 50 ГБ (и последнее, я хотел бы обрабатывать больше портов, что означает больше данных в единицу времени).
Проблема заключается в том, что эти файлы, в силу характера их создания, становятся чрезвычайно фрагментированными, что делает их извлечение данных из ноутбука кошмаром: скорость чтения жесткого диска составляет 1-2 МБ / с.
Как я мог предотвратить фрагментацию, чтобы файлы могли быть прочитаны быстрее; использование SSD не вариант.
Я, хотя о предварительном распределении пространства для файлов с шагом 1 ГБ; тогда файлы были бы фрагментами по 1 ГБ вместо 16 КБ, но я не знаю, как это сделать; Файлы ДОЛЖНЫ быть закрыты каждую секунду, чтобы другие процессы могли получить к ним доступ, и они ДОЛЖНЫ быть записаны непосредственно на диск, чтобы минимизировать потерю данных из-за сбоя питания. Итак FileStream.SetLength
на самом деле не в игре, я думаю.
Я также использовал Contig в каталоге, содержащем файлы журналов, чтобы периодически его дефрагментировать. Тем не менее, я прочитал, что это касается только файла, который он дефрагментирует, поэтому в основном он будет копировать его в пустое пространство каждый раз, что потребует огромных накладных расходов и много времени. Можно ли как-нибудь заставить его дефрагментировать каталог в целом?
Я также думал о том, чтобы периодически запускать встроенную утилиту дефрагментации диска, но я не знаю, хорошая ли это идея. Как вы думаете?
Я действительно не хочу писать свою единственную утилиту дефрагментации с использованием winAPI.
Какие решения вы можете предложить для моей проблемы?
Может быть, есть способ сказать Windows, чтобы предварительно выделить единое пространство для файла, так что это сохраняет предварительно выделенное пространство между закрытиями файла?
Может быть, это хорошая идея использовать базу данных вместо текстовых файлов? Может быть, этот вопрос уже решен в их реализации? Какую базу данных вы бы порекомендовали? Мне нужен файл в виде простого текста в конце, после копирования их на мою рабочую станцию, но на рабочей станции у меня есть SSD.