Может быть, у меня есть несколько предложений для вас.
Прежде всего, почему вы ищете программное решение, реализованное самостоятельно?
Вы можете просто разбить большой файл журнала на куски, то есть на почасовой или даже поминутной основе, и собирать их в отдельный словарь на ежедневной основе (чтобы не загромождать FS с огромным количеством файлов)в одном каталоге), поэтому вместо большого файла, который вам нужно обработать и найти, у вас будет много маленьких файлов, к которым можно быстро получить доступ по имени файла в сочетании с простыми правилами.Наличие большого файла - плохая идея (до тех пор, пока у вас не будет какой-то индекс), так как вам придется искать через него, чтобы найти подходящую информацию (например, по операции datetime), а операция поиска будет значительно длиннее.
Ситуациястановится еще хуже, когда начинает действовать сжатие, так как вам придется распаковывать данные для их поиска или создавать какой-то индекс.Нет необходимости делать это самостоятельно, вы можете включить сжатие папок в ОС и получить все преимущества сжатия прозрачно без какого-либо кодирования.
Итак, я бы посоветовал не изобретать велосипед (кроме случаев, когда это действительно нужно, см. Ниже):
- Разделение данных журнала на регулярной основе, например, по часамчтобы уменьшить производительность сжатия, нажмите
- Включите сжатие папок ОС
Вот и все, вы уменьшите объем памяти.
Для продолжениясвой (в случае, если вы действительно этого хотите).Вы можете сделать то же самое, разбить данные на куски, сжать каждый и сохранить в вашем виде хранилища.Чтобы реализовать нечто подобное, я подумал бы о следующем:
- сохранить один файл с необработанными (несжатыми) данными, в который вы будете записывать новую информацию;
- сохранить и обновить индексный файл, напримерс сохраненными диапазонами дат на блок для быстрого поиска позиции файла в сжатых данных по дате;
- сохранение файла для хранения сжатых данных, каждый блок в нем содержит свой размер и сжатые (например, с GZipStream) данные;
Таким образом, вы будете записывать информацию в несжатую часть до некоторого состояния, затем сжимаете ее и добавляете в сжатую часть, обновляя индексный файл.Хранение индексного файла как отдельного позволяет быстро обновлять без перезаписи огромной сжатой части.
Также я бы посоветовал подумать , почему у вас такие большие файлы журналов.Вероятно, вы можете оптимизировать формат хранения.Например, если ваши журналы представляют собой текстовые файлы, вы можете переключиться в двоичный формат, например, создать словарь из исходных строк и хранить только идентификаторы сообщений вместо полных данных, например:
обновление региона 1;
обновление области 2;
сжатие данных;
сохранить как:
x1 1
x1 2
x2
Строки, приведенные выше только для примера, вы можете «распаковать» их во время выполнения по мере необходимости, переназначая данные обратно.Вы можете сэкономить много места, переключившись на двоичный код и, возможно, достаточно, чтобы забыть о сжатии.
У меня нет готовой реализации или алгоритма.Может быть, другие могут предложить лучше, но надеюсь, что мои мысли будут несколько полезны.