在 gz 文件上加速 sed

Speed up sed on a gz file

提问人:Matias 提问时间:9/11/2020 最后编辑:phoMatias 更新时间:9/14/2020 访问量:869

问:

我正在使用脚本来处理文件并以这种方式删除文本:sed

gzip -cd /data/file.gz | sed 's/WITH (appendonly=true, compresstype=quicklz)//' | gzip > file_seeded.gz

对大文件(例如 50GB)执行操作需要花费大量时间。我这样做的方式是最佳方式,还是有其他方法可以加快该过程?

性能 文件 sed gzip

评论

2赞 Sundeep 9/11/2020
50GB 很多,我认为你不能在这里加快速度,除了使用如果你的输入是 ASCII 的......我建议 github.com/chmln/sd 比 sed 甚至 github.com/BurntSushi/ripgrep 更好的速度(参见 unix.stackexchange.com/questions/112023/...示例)sedLC_ALL=C sed '...'
1赞 shellter 9/11/2020
同意上述所有内容,并补充说,除非您可以更改生产者进程以创建更小(和更多)的文件,否则这些备用实用程序是您最好的选择。如果您的文件有多个部分(自动创建),则可以使用或在同一“数据集”上运行多个部分。但是,我认为这可能是那里最昂贵的过程(除非你有一个疯狂的文件),所以不要指望有太多的改进。也许首先进行一些快速测试是有序的。祝你好运!xargsgnu-parallelsed| gzip > outFilesed
1赞 shellter 9/11/2020
而且我不认为在运行多个 seds 之前尝试拆分大文件会节省您的任何时间,但是......谁知道呢,根据你对减少运行时间的重视程度,它可能会减少几秒钟,所以同样,快速测试将帮助你知道你已经涵盖了所有的可能性。祝你好运!

答:

2赞 Mark Adler 9/12/2020 #1

无法避免重新压缩编辑后的数据,这会占用执行时间。我所能建议的就是使用或加速压缩,但代价是输出稍大。您还可以使用 pigz 来使用您的所有内核。gzip -1gzip -3

2赞 Ole Tange 9/14/2020 #2

使用您可以附加多个 gzip 文件的事实:

mysed() {
  sed 's/WITH (appendonly=true, compresstype=quicklz)//' | gzip
}
export -f mysed
gzip -cd /data/file.gz | parallel --pipe -k --block 50M mysed > file_seeded.gz

进行调整,直到找到最有效的值。这取决于 /tmp 的 I/O 速度以及您拥有的 RAM 和 CPU 缓存量。最佳值很可能在 1M 到 1000M 之间。50M

如果时间比磁盘空间更重要,请使用 。gzip -1