2

我创建了一个简单的子字符串搜索程序,它递归地查看文件夹并扫描大量文件。该程序使用 Boyer-Moore-Horspool 算法,在解析大量数据方面非常有效。

程序链接:http: //pastebin.com/KqEMMMCT

我现在要做的是让它更有效率。如果查看代码,您会注意到搜索了三个不同的目录。我希望能够创建一个同时搜索每个目录的进程/线程,这将大大加快我的程序。

实现这一点的最佳方法是什么?我已经做了一些初步研究,但我的实现并不成功。它们似乎在 25 分钟左右的处理后就死掉了(现在单进程版本需要将近 24 小时才能运行;数据量很大,并且有 648 个唯一关键字。)

我使用多处理 API 进行了各种实验,并将所有各种文件压缩为 3 个文件(每个目录一个),然后通过 mmap() 将文件映射到内存,但是我不确定这是否是合适的路线去,然后 b:我的程序总是在随机点死掉,调试绝对是一场噩梦。

是的,我已经进行了广泛的谷歌搜索,但我在池/线程/子进程/多线程/多处理之间感到非常困惑。

我不是要你写我的程序,只是帮助我理解实施解决方案所需的思考过程。谢谢!

仅供参考:我计划在程序运行后开源代码。我认为这是一个相当有用的脚本,并且在线提供的多处理现实世界实现的示例有限。

4

2 回答 2

5

做什么取决于是什么减慢了这个过程。

如果您正在单个磁盘上读取,并且磁盘 I/O 会减慢您的速度,那么多个线程/进程可能只会减慢您的速度,因为读取头现在会随着不同的线程获得控制权而到处跳跃,而您将花费更多时间寻找而不是阅读。

如果您在单个磁盘上读取,并且处理速度会减慢您的速度,那么您可能会通过使用多处理来分析数据获得加速,但您仍然应该从单个线程读取以避免寻道时间延迟(这通常是非常长,多毫秒)。

如果您正在从多个磁盘读取数据,并且磁盘 I/O 会降低您的速度,那么多个线程或进程可能会提高您的速度。线程更容易,并且由于您的大部分延迟时间都远离处理器,因此 GIL 不会妨碍您。

如果您正在从多个磁盘读取数据,并且处理速度会减慢您的速度,那么您需要使用多处理。

于 2012-04-11T16:51:45.693 回答
1

多处理比多线程(IMO)更容易理解/使用。出于我的原因,我建议阅读TAOUP 的这一部分。基本上,一个线程所做的一切,一个进程所做的,只有程序员必须做操作系统可以处理的所有事情。共享资源(内存/文件/CPU 周期)?学习线程的锁定/互斥体/信号量等。如果您使用进程,操作系统会为您执行此操作。

我建议建立 4 个以上的流程。1 从硬盘驱动器中提取数据,其他三个查询下一块。也许是第五个过程将它们粘在一起。

这自然适合生成器。请参阅genfind示例以及使用它的gengrep示例。

同样在同一个站点上,查看协程部分。

于 2012-04-11T17:42:57.340 回答