Я сжимаю файлы более 2 ГБ на Java, используя последовательное применение двух алгоритмов сжатия; один основанный на LZ и один основанный на Хаффмане. (Это похоже на DEFLATE).Сжатие больших файлов с использованием блоков в Java
Поскольку 2GB слишком велик для хранения в любом буфере, я должен передать файл через один алгоритм, выводящий временный файл, а затем передать этот временный файл через второй алгоритм, выводящий окончательный файл.
Альтернативой является сжатие файла в блоках размером 8 МБ (размер, в котором я не получаю ошибку Out-Of-Memory), но тогда у меня есть невозможность в полной мере использовать избыточность во всем файле.
Любые идеи, как выполнять эти операции аккуратно. Нет временных файлов и без сжатия в блоках? Сжимают ли другие инструменты сжатия в блоках? Как они справляются с этой проблемой? С уважением
Если вы используете 64-битную JVM, вы можете выделить достаточно места для кучи, чтобы использовать МНОГО БОЛЬШИХ блоков (то есть 1 ГБ вместо 8 МБ). Посмотрите варианты JVM '-Xms' и' -Xmx'. –
Выполняют ли ваши реализации алгоритма какой-либо вывод, пока они полностью не прочитают ввод? Если это так, вам не повезло, и вам нужно будет использовать временное хранилище.Тем не менее, я серьезно сомневаюсь, что это так, каждый алгоритм начинает выдавать результат после чтения некоторой части ввода. В этом случае вы можете использовать каналы для подачи выходного потока первого алгоритма ко второму и записи вывода из второго на диск. –
Я думаю, что вы переоцениваете «способность полностью использовать избыточность во всем файле». Используйте меньшие блоки. Хотя странно, что вы не можете использовать блок размером более 8 МБ. Кажется, у вас очень маленькая куча. – Holger