Для экономии места наши файлы журналов сжаты. Обычно мы держим их сжатыми и просто делаем
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
тоже удобно.