2

问题陈述:-

我需要String Pattern在周围搜索一个特定10000 files的并在包含它的文件中找到记录particular pattern。我可以grep在这里使用,但是需要很多时间。

下面是我用来搜索 aparticular string pattern之后unzipping的命令dat.gz file

gzcat /data/newfolder/real-time-newdata/*_20120809_0_*.gz | grep 'b295ed051380a47a2f65fb75ff0d7aa7^]3^]-1'

如果我简单地计算解压后有多少个文件dat.gz file

gzcat /data/newfolder/real-time-newdata/*_20120809_0_*.gz | wc -l

我绕过10000 files。我需要在所有这些中搜索上述字符串模式10000 files并找出包含上述内容的记录String Pattern。我上面的命令运行良好,但速度非常慢。

对此最好的方法是什么?我们是否应该100 files一次在100 files parallelly.

笔记:

我正在运行SunOS

bash-3.00$ uname -a
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc
4

4 回答 4

2

不要并行运行!!!!这会使磁盘头到处弹跳,速度会慢得多。

由于您正在阅读存档文件,因此有一种方法可以显着提高性能 - 不要将解压缩的结果写出来。理想的答案是解压缩到内存中的流,如果这不可行,则解压缩到 ramdisk。

无论如何,您确实需要一些并行性——一个线程应该获取数据,然后将其交给另一个进行搜索的线程。这样,您要么在磁盘上等待,要么在内核上等待解压缩,您不会浪费任何时间进行搜索。

(请注意,如果是 ramdisk,您将需要积极地读取它写入的文件,然后将它们杀死,这样 ramdisk 就不会被填满。)

于 2012-08-16T00:10:09.690 回答
0

gzcat .... | wc -l没有表示 10000 个文件,它表示无论有多少文件,总共有 10000 行。

这是xargs存在的问题类型。假设您的版本gzip附带了一个名为gzgrep(或者可能只是zgrep)的脚本,您可以这样做:

find /data/newfolder/real-time-newdata -type f -name "*_20120809_0_*.gz" -print | xargs gzgrep

这将运行一个gzgrep命令,其中包含尽可能多的单个文件的批次,因为它可以容纳在命令行上(有xargs限制数量的选项,或用于许多其他事情)。不幸的是,gzgrep仍然必须解压缩每个文件并将其传递给grep,但实际上并没有什么好的方法可以避免必须解压缩整个语料库才能进行搜索。但是,以这种方式使用xargs将减少需要生成的新进程的总数。

于 2012-08-16T20:45:22.363 回答
0

对于初学者,您需要将文件解压缩到磁盘。

这确实有效(在 bash 中),但您可能不想尝试同时启动 10,000 个进程。在未压缩的目录中运行它:

for i in `find . -type f`; do ((grep 'b295ed051380a47a2f65fb75ff0d7aa7^]3^]-1' $i )&); done

因此,我们需要有一种方法来限制衍生进程的数量。只要机器上运行的 grep 进程数超过 10(包括进行计数的进程),这就会循环:

while [ `top -b -n1 | grep -c grep` -gt 10  ]; do echo true; done

我已经运行了它,它可以工作....但是 top 运行时间很长,以至于它有效地将您限制为每秒一个 grep。有人可以对此进行改进,在启动新进程时将计数加一并在进程结束时减一吗?

for i in `find . -type f`; do ((grep -l 'blah' $i)&); (while [ `top -b -n1 | grep -c grep` -gt 10 ]; do sleep 1; done); done

关于如何确定何时睡觉和何时不睡觉的任何其他想法?对不起,部分解决方案,但我希望有人有你需要的另一部分。

于 2012-08-16T00:08:29.043 回答
0

如果不使用正则表达式,可以使用 grep 的 -F 选项或使用 fgrep。这可能会为您提供额外的性能。

于 2012-08-16T20:21:54.633 回答