Я генерирую относительно большие файлы, используя Perl. Файлы, которые я генерирую, бывают двух видов:
Табличные файлы, то есть текстовые файлы, которые я печатаю построчно (строка за строкой), которые содержат в основном числа. Типичная линия выглядит так:
126891 126991 14545 12
Сериализованные объекты, которые я создаю и сохраняю в файл, используя Storable::nstore
Эти объекты обычно содержат большой хеш с числовыми значениями. Значения в объекте могли быть pack
отредактированы для экономии места (и объект unpack
s каждое значение перед его использованием).
В настоящее время я обычно делаю следующее:
use IO::Compress::Gzip qw(gzip $GzipError);
# create normal, uncompressed file ($out_file)
# ...
# compress file using gzip
my $gz_out_file = "$out_file.gz";
gzip $out_file => $gz_out_file or die "gzip failed: $GzipError";
# delete uncompressed file
unlink($out_file) or die "can't unlink file $out_file: $!";
Это довольно неэффективно, так как я сначала записываю большой файл на диск, затем gzip
снова читаю его и сжимаю. Поэтому мои вопросы следующие:
Могу ли я создать сжатый файл без предварительной записи файла на диск? Можно ли создать сжатый файл последовательно, то есть печатать построчно, как в сценарии (1), описанном ранее?
Звучит ли Gzip
как подходящий выбор? Есть ли другие рекомендованные компрессоры для данных, которые я описал?
Имеет ли смысл pack
значений в объекте, которые впоследствии все равно будут сохранены и сжаты?
Мои соображения сводятся в основном к экономии дискового пространства и последующей быстрой декомпрессии.