2012-03-17 51 views
0

我想编写一个程序,就像grep命令来处理我的sql文件。我希望它能在工作时使用我所有的核心。使用MPI或Pthreads无关紧要。但是,如何将文件分成4个文件?我的意思是,如果我有700MB大小的txt文件,如何使每个线程处理该文件的1/4。如何将grep测试划分为并行任务

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

可能得到的文件有多少行有需要很长的时间:

[email protected] ~ % time wc -l lineitem.tbl 
6001215 lineitem.tbl 
wc -l lineitem.tbl 0.20s user 0.40s system 4% cpu 12.996 total 
+0

没有数据很难测试'wc -l'需要多长时间。这应该返回行数(即:需要多长时间?) – 2012-03-17 13:49:31

+0

您是否在寻找类似[GNU parallel](http://en.wikipedia.org/wiki/GNU_parallel)的内容? – Pascal 2012-03-17 13:52:05

+0

@JonasWielicki这将需要很长时间。我编辑我的问题,只需添加'wc -l'所花费的时间。谢谢〜 – madper 2012-03-17 13:54:50

回答

2

你想要做的也不是很容易。像Google的MapReduce和Apache Hadoop这样的框架已经被创建来处理这样的问题。在一般情况下,为任意并行处理而拆分任意大文件是一个难题,最好为此任务使用专用框架。但在你的情况,因为你似乎有非常具体的要求,你可能能够做到这样的事情:

将文件拆分成N块(其中N =核心数)。很显然,这不会考虑行界限,因此您需要一个“分隔符”例程,用于搜索每个块中的下一个新行字符。 (这可能会很棘手,以避免重叠,但它基本上是Hadoop或MapReduce的功能。)然后,您可以并行处理每个块。

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

+0

非常感谢!我现在就试试。我认为可以设置不同的文件偏移量以避免将所有此文件加载到内存中。 – madper 2012-03-17 15:05:58

3

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

有关于在http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder

解决由蒂姆·布雷类似的问题,他得到了很多人的帮助,调查类似这类问题(扫描系统日志),所以你可能会发现一些很长的跑步系列在那里准备好了帮助。

+0

感谢您的建议〜:D – madper 2012-03-18 03:03:42

+0

非常欢迎。我希望你有调查解决方案的乐趣。 – gbulmer 2012-03-18 03:28:11

+0

也许我可以创建一个线程仅用于从文件读取数据。然后,将数据放入三个缓冲区,并创建三个线程来处理数据。我希望能够避免磁盘缓存命中率下降 – madper 2012-03-18 04:36:31