Для последовательного чтения сохраняются большие наборы 32-битных целых значений, отсортированные по возрастанию, только уникальные значения. Исходные файлы большие, не могут вписываться в ОЗУ, читаются блочно. Пока я просто сохраняю их как двоичные файлы, по 4 байта на каждое значение.Как сохранить отсортированный набор целых чисел в двоичном файле?
По мере роста системы необходимо оптимизировать пространство для хранения и резервного копирования, и я нахожу, что существует большой потенциал для эффективного сжатия таких данных с учетом его сортировки.
То, что я придумал, это сохранить начальное значение, а затем приращения, которые, как правило, являются меньшими значениями по мере увеличения количества значений в наборе. Закругляя их размер на полные байты, я предлагаю оставить только значимые байты на инкремент, поэтому вместо 4 может быть 1-2-3 байта на шаг. И чтобы указать количество используемых байтов, я бы использовал заголовок 2 бита за каждый шаг.
поток будет выглядеть следующим образом:
01010101 01010101 01010101 01010101 - initial value
Four increments block start
10110101 - b bytes used: four 2-bit pairs
(10 11 01 01 = 2, 3, 1, 1)
01010101 01010101 - inc
01010101 01010101 01010101 - inc
01010101 - inc
01010101 - inc
Four increments block start
11011101 - b (11 01 11 01 = 3, 1, 3, 1)
01010101 01010101 01010101 - inc
01010101 - inc
01010101 01010101 01010101 - inc
01010101 - inc
...
я пытаюсь изобрести колесо здесь? Может ли сжатие потока быть более эффективным здесь, оставаясь работоспособным на довольно небольших блоках?
, так что вы хотите сжать данные с помощью PHP? какие данные? если вы пытаетесь преобразовать файл в двоичный файл и сохранить его. это не будет эффективно вообще – codinginsane
Насколько велики ваши файлы? Может быть, использовать решение на базе базы данных, поддерживающее сжатие, это способ сделать это? Таким образом, вы получаете всю функциональность, не переосмысливая любые колеса – Konstantin
@CodingInsane, как указано в вопросе: данные упорядочены наборы из 32-битных целых чисел. Полученный из некоторой службы, сохраненный в локальном файле в двоичном формате. «это не будет эффективно вообще» - почему? – Serge