3

我有一个包含几行的文本文件,我正在这个文件中寻找一个字符串。我需要将以下命令行参数传递给程序:
- 文件路径
- 我要查找的字符串
- 允许程序“分叉”以完成此任务的最大进程数。

这样的程序应该如何构建?

4

4 回答 4

3

几个想法。

  • 您必须与每个进程分开打开文件,否则它们将共享一个文件描述符,因此在文件中具有共享位置(或不,请参阅注释,因为这可能是系统特定的......)。
  • 由于磁盘访问和/或缓存未命中模式,您可能看不到您希望的速度提高。

您可以通过内存映射文件来解决这两个问题(当然,您仍然冒着增加缓存未命中率的风险)......


你有多需要这个?它存在过早优化的真正风险。我建议不要在没有迫切需要的情况下接触这个问题。真的。

于 2008-10-11T19:46:14.640 回答
2

考虑一下为什么你认为你需要并行化它,以及你是否会看到任何实际的性能优势。您可能会受到磁盘访问时间的限制,并且分叉会产生开销。您最好的选择可能是进行标准的单线程搜索(可能使用正则表达式)。

于 2008-10-11T19:51:06.940 回答
1

假设你真的认为这是必要的(或者这是家庭作业?),一个(相对高级的)方法可能是:

  1. 计算要搜索的文件的大小(例如使用 fopen、fseek(file, END)、fclose)
  2. 将文件中的两个偏移量关联到每个进程:搜索开始偏移量和搜索结束偏移量:
    startIndex = indexOfProcess * fileSize / numberOfProcesses
    endIndex = (indexOfProcess + 1) * fileSize / numberOfProcesses
    
    您必须考虑这样一个事实,即要搜索的字符串可以通过添加一些重叠来跨越两个或多个进程的切片(这将是字符串大小的函数)。
  3. fork,在每个进程中打开文件(在读取模式下),fseek 到开始索引,搜索字符串,就好像你有一个大小的文件(endIndex - startIndex),然后将结果转储到屏幕上(或者,如果你有更具体的要求,请告诉我们)。
于 2008-10-11T21:23:01.357 回答
1

要么这是作业,要么这是无用的。瓶颈在于磁盘带宽,而不是 CPU 能力。使用同时访问只会减慢您的速度。

于 2008-10-11T21:35:24.127 回答