【问题标题】:How to divide a grep test in to a parallel task如何将 grep 测试划分为并行任务
【发布时间】:2012-03-17 13:47:20
【问题描述】:

我想写一个类似grep命令的程序来处理我的sql文件。我希望它在工作时可以使用我所有的内核。使用 MPI 或仅使用 Pthreads,没关系。但是,如何将文件分成 4 个文件?我的意思是,如果我有一个 700mb 大小的 txt 文件,如何让每个线程处理该文件的 1/4。

在我看来,我需要知道这个文件有多少行,然后为每个线程设置不同的文件偏移量。这是一个好方法,以及如何获得总行数?

也许得到文件有多少行需要很长时间:

madper@myhost ~ % time wc -l lineitem.tbl
6001215 lineitem.tbl
wc -l lineitem.tbl  0.20s user 0.40s system 4% cpu 12.996 total

【问题讨论】:

  • 如果没有数据,很难测试wc -l 需要多长时间。那应该返回行数(即:需要多长时间?)
  • 你在寻找类似GNU parallel的东西吗?
  • @JonasWielicki 这需要很长时间。我编辑我的问题,只需添加wc -l 花费的时间。谢谢~
  • @Pascal 非常感谢!但我需要写一篇来培养技能。

标签: c regex multithreading grep parallel-processing


【解决方案1】:

首先,您的运行时统计数据看起来像是程序受 I/O 限制。 有大量的备用 CPU。因此,使 CPU 部分并行不太可能产生太大的积极影响。事实上,它可能会使情况变得更糟,因为磁盘缓存可能不太有效。

Tim Bray 在http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder 上有一个关于解决类似问题的长期系列文章

他得到了很多人的帮助来调查类似的问题(扫描系统日志),所以你可能会在那里找到一些现成的帮助。

【讨论】:

  • 不客气。希望您在研究解决方案时玩得开心。
  • 也许我可以创建一个线程来从文件中读取数据。然后,将数据放入三个缓冲区,并创建三个线程来处理数据。我希望可以避免磁盘缓存命中率下降
【解决方案2】:

你想做的事情并不容易。已经创建了像 Google 的 MapReduce 和 Apache Hadoop 这样的框架来处理这样的问题。在一般情况下,为任意并行处理拆分任意大文件是一个难题,最好使用专门的框架来完成这项任务。但在您的情况下,由于您似乎有非常具体的要求,您可能可以执行以下操作:

将文件分成 N 个块(其中 N = 内核数)。显然,这不会尊重行边界,因此您需要一个“拆分器”例程来搜索每个块中的下一个换行符。 (这可能很难做到正确并避免重叠,但这基本上是 Hadoop 或 MapReduce 所做的。)然后您可以并行处理每个块。

当然,这可能不像您想象的那样有效。如果整个文件不适合内存,您将遇到 I/O 问题。仅仅因为您正在并行化 CPU 使用率并不一定意味着您正在并行化 I/O。这就是为什么分布式处理框架通常还会将数据拆分到多个硬盘驱动器或集群节点上。

【讨论】:

  • 非常感谢!我现在试试。我认为可以设置不同的文件偏移量以避免将所有这些文件加载​​到内存中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2020-03-12
相关资源
最近更新 更多