【问题标题】:Searching a particular string pattern out of 10000 files in parallel并行搜索 10000 个文件中的特定字符串模式
【发布时间】:2012-08-12 07:20:53
【问题描述】:

问题陈述:-

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

下面是我用来在unzippingdat.gz file 之后搜索particular string pattern 的命令

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

【问题讨论】:

  • 尝试对解压缩文件运行相同的命令...瓶颈很可能是解压缩文件。

标签: linux bash grep solaris sunos


【解决方案1】:

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

这确实有效(在 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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 对我有意义,但我无法解压缩文件然后查找字符串模式,因为所有这些文件都是 40 GB 文件,而且我们也有空间问题。这就是我一直在寻找其他方法的原因。
    • @loren 我原则上同意,但我认为不应该假设底层磁盘硬件是一个简单的硬盘驱动器。例如,数据可能是条带化的,可能有多个控制器等。有意义的并行量可能只能凭经验发现。
    • @frankc:除非底层媒体是 SSD,其读取量等于其块大小,否则会出现寻道问题。
    • @TechGeeky:如果你不写出解压缩的文件,它们的大小并不重要。找到一个可以将文件读取到内存的库(假设它们不是太大。40gb 数据中的 10k 个文件意味着平均 4mb/文件,除非分布很奇怪,否则这不会有任何问题。)我已经完成了在 DOS 时代解压缩到内存,在现代的东西上,我编写了创建和发送 zip 文件的代码,而无需将任何内容写入磁盘。如果没有办法做到这一点,我会感到惊讶。
    • @loren 搜索问题并不意味着并行性没有加速。我认为产生加速的并行度水平必须通过经验来发现。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您的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 将减少需要生成的新进程的总数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 2012-09-09
        相关资源
        最近更新 更多