Назад | Перейти на главную страницу

Gunzip работает в памяти или записывает на диск?

Для экономии места наши файлы журналов сжаты. Обычно мы держим их сжатыми и просто делаем

gunzip -c file.gz | grep 'test'

чтобы найти важную информацию, но нам интересно, не проще ли сохранить файлы в несжатом виде, а затем выполнить команду grep.

cat file | grep 'test'

Было несколько дискуссий о том, как работает gzip, есть ли смысл в том, что если он читает его в память и распаковывает, то первый будет быстрее, а если нет, то второй будет быстрее. Кто-нибудь знает, как gzip распаковывает данные?

Несжатый файл всегда будет быстрее отследить, так как с этим не связаны накладные расходы. Даже если вы не пишете временный файл, вы выполняете действия по декомпрессии, которые перегружают процессор. Если вы обращаетесь к этим файлам достаточно часто, вероятно, лучше оставить их несжатыми, если у вас есть место.

Тем не менее, выгрузка данных в стандартный формат (gunzip -c, zcat и т. Д.) Не запускает запись во временный файл. Данные передаются прямо в grep команда, которая рассматривает несжатый поток как собственный стандарт в.

Статья в Википедии о кодировке LZ * находится здесь: http://en.wikipedia.org/wiki/LZ77_and_LZ78.

Как всегда, ничто не сравнится с фактическим измерением.

Ваш пробег может отличаться, но в моей системе поиск уже несжатого файла занимал примерно треть времени, zcat или gunzip в grep сделал. Это не удивительно.

Вы также можете заменить gzip на lzo для повышения производительности.

Использование LZO может ускорить работу (меньший дисковый ввод-вывод и небольшие накладные расходы процессора на сжатие)

gzip -dc | grep foo (или gunzip -c) | grep foo пишет в канал. Как реализован канал, зависит от вашей операционной системы, но обычно он остается в памяти. Как указывали другие, поиск несжатого файла всегда будет быстрее из-за времени, необходимого для распаковки сжатых данных. Использование другой программы сжатия может улучшить или не улучшить производительность; вы всегда можете это измерить.

Использование сжатия могло бы действительно доставить Быстрее пропускная способность дисков, но это зависит от ряда факторов, включая используемый алгоритм сжатия и тип данных, которые вы перемещаете. ZFS, например, в значительной степени полагается на это предположение.

gzip либо распакует весь файл во временный, либо переименует его в конце (стандартный gzip -d myfile.gz) или вообще не использовать какой-либо временный файл, читая несколько блоков сжатых данных за раз и выводя несжатые данные на стандартный вывод (gzip -d -c...).

В современной системе я подозреваю gunzip | grep может быть быстрее, чем поиск несжатого файла, с другой стороны gunzip | grep всегда побеждает распаковку файла, а затем поиск несжатого файла :)

Зависит от размера файла: когда преобладает ввод-вывод, центральный процессор, выполняющий распаковку, занимает меньше времени, чем передача файла. Будет ли ввод-вывод доминировать, во многом зависит от относительной скорости вашего процессора, ваших систем хранения и пропускной способности между ними.

Кроме того, в стороне, grep -Z он же zgrep тоже удобно.