Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将grep测试划分为并行任务_C_Regex_Multithreading_Grep_Parallel Processing - Fatal编程技术网

C 如何将grep测试划分为并行任务

C 如何将grep测试划分为并行任务,c,regex,multithreading,grep,parallel-processing,C,Regex,Multithreading,Grep,Parallel Processing,我想写一个像grep命令一样的程序来处理我的sql文件。我希望它能在工作时使用我所有的内核。使用MPI或仅仅使用Pthreads,这并不重要。但是,如何将文件分成4个文件?我的意思是,如果我有一个700mb大小的txt文件,如何让每个线程处理该文件的1/4 在我看来,我需要知道这个文件有多少行,然后,每个线程设置不同的文件偏移量。这是一个好方法吗?如何获得总行数 可能需要很长时间才能获取文件的行数: madper@myhost ~ % time wc -l lineitem.tbl 600121

我想写一个像
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

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

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


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

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

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


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

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

蒂姆·布雷(Tim Bray)在伦敦大学的一个关于解决类似问题的长期系列节目


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

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

蒂姆·布雷(Tim Bray)在伦敦大学的一个关于解决类似问题的长期系列节目


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

如果没有数据,很难测试一个
wc-l
需要多长时间。这应该会返回行数(即:需要多长时间?)您是否在寻找类似的内容?@JonasWielicki这将需要很长时间。我编辑我的问题,只需添加
wc-l
所需的时间。谢谢~@Pascal非常感谢!但是我需要写一篇关于建筑技巧的文章。如果没有数据,很难测试一个
wc-l
需要多长时间。这应该会返回行数(即:需要多长时间?)您是否在寻找类似的内容?@JonasWielicki这将需要很长时间。我编辑我的问题,只需添加
wc-l
所需的时间。谢谢~@Pascal非常感谢!但是我需要写一篇关于建筑技巧的文章。非常感谢!我现在就试试。我认为可以设置不同的文件偏移量,以避免将所有文件加载到内存中。非常感谢!我现在就试试。我认为可以设置不同的文件偏移量,以避免将所有文件加载到内存中。非常欢迎。我希望你们在研究解决方案时玩得开心。也许我可以创建一个线程来读取文件中的数据。然后,将数据放入三个缓冲区,并创建三个线程来处理数据。我希望这样可以避免磁盘缓存命中率下降,非常欢迎。我希望你们在研究解决方案时玩得开心。也许我可以创建一个线程来读取文件中的数据。然后,将数据放入三个缓冲区,并创建三个线程来处理数据。我希望这样可以避免磁盘缓存命中率下降