1

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

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

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

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

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

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

你能帮我开始吗?

提前致谢!

4

1 回答 1

1

从概念上讲(不特定于 Perl),我会使用这样的东西:

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

优点:

  1. 缓存友好 - 所有线程同时扫描相同的数据。
  2. 流式传输 - 您需要在内存中保存的数据大小一次最多为 2*(块大小),这使得它在内存上非常便宜,并且与整体数据大小完全无关。
  3. 可扩展 - 更多可用线程将立即转化为速度(只要您适当调整块大小)。
    • 当然,这里有一些限制。在某个点,块大小将非常大,以至于由于内存局部性差,它可能会减慢正则表达式线程 - 在该点之外添加更多线程可能只会减慢速度。

另外,尽量让每个线程保持自己的匹配,不要将它们同步到同一个位置——这会产生竞争条件。如果您需要同步线程,请在上述步骤 (4) 和 (5) 之间进行。

不幸的是,我的 Perl 非常生锈,但在您得到更好的答案之前,我将发布此内容,希望它有用。

于 2013-06-20T13:38:59.173 回答