PERL - 多线程搜索非常大的文本文件中的术语列表

时间:2013-06-20 10:58:33

标签: multithreading parsing grep

我正在寻找我的问题的答案,但我找不到满足我需要的解决方案。

我有一个大文本文件(4GB),它是来自代理的access.log文件。

我还有另一个包含7000行的文件,其中包含一些域名地址或部分网址,可以在我的日志文件中搜索。

问题是要在日志文件中搜索我的7000个术语,花了很长时间。

我想用多线程或其他东西减少这段时间。

但我以前从未编写过这样的东西: - /

你可以帮助我开始吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

从概念上讲(不是Perl特有的),我会选择这样的东西:

  1. 创建N个线程并分配每个7000 / N正则表达式进行测试。
    • 优选地,N =可用机器线程的数量。
    • 根据正则表达式的复杂性或长度,每个线程可能值得分配更多或更少的正则表达式。目标是为所有线程分配大致相同的工作量。这可能需要对正则表达式进行一些繁重的预处理。
  2. 将一大块数据加载到内存中。
    • 您可以在这里尝试不同的尺寸。
    • 目标是加载此数据量大约需要线程处理它所需的时间。
  3. 在刚刚加载的数据上启动正则表达式线程。并行使用另一个线程将下一个数据块加载到内存中。
  4. 等到所有线程都完成。
  5. 丢弃先前加载的第一个数据块。
  6. 转到(3)
  7. 优点:

    1. 缓存友好 - 所有线程同时扫描相同的数据。
    2. 流式传输 - 您需要在内存中保存的数据大小最多为2 *(块大小),使其在内存上非常便宜,并且与整体数据大小完全无关。
    3. 可扩展 - 更多可用线程将立即转换为速度(只要您适当调整块大小)。
      • 当然,这里有一些限制。在某个时刻,块大小将会很大,以至于因为内存不足而导致正则表达式线程变慢 - 在该点之外添加更多线程可能只会减慢速度。
    4. 此外,尝试使每个线程保持自己的匹配,并且不要将它们同步到同一位置 - 这可能会创建竞争条件。如果需要同步线程,请在上面的步骤(4)和(5)之间进行。

      不幸的是,我的Perl非常生疏,但在你得到一个更好的答案之前我会发布这个,希望它会有用。