在进行并行搜索时,内存带宽何时成为限制因素?

时间:2009-07-29 17:36:47

标签: c++ c file-io

我正在搜索并尝试查找给定字符串的每个匹配项的大型文件(从几千兆字节到几百千兆字节)。

我一直在考虑让它并行运行并有一些问题。

  1. 我该怎么做?我不能将整个文件复制到内存中,因为它太大了。多个FILE *指针会起作用吗?

  2. 在磁盘带宽成为限制因素之前,我可以在文件上放多少个线程,而不是CPU?我该如何解决这个问题?

  3. 目前,我在想的是我会使用4个线程,每个都使用FILE *以0%,25%,50%和75%的方式执行文件,并将每个结果保存到文件中或记忆,然后收集结果作为最后一步。虽然采用这种方法,但根据带宽,我可以轻松添加更多线程,并可能获得更大的加速。

    您怎么看?

    编辑:当我说内存带宽时,我实际上是指磁盘I / O.对不起。

3 个答案:

答案 0 :(得分:6)

通过这个问题的新修订版,答案是“几乎立即”。硬盘不是很擅长同时从磁盘上的两个位置读取。 :)如果你有多个硬盘驱动器并将文件分割成它们,你可能会利用一些线程。但公平地说,我会说磁盘速度已经限制因素。我非常怀疑你的磁盘能够以比处理器更快的速度读取数据。

答案 1 :(得分:1)

我怀疑内存带宽会像磁盘IO限制一样大。对于大多数硬件,您将非常受限于每个线程如何从磁盘读取 -

如果你想最大化吞吐量,你可能需要做一些事情,比如有一个线程谁的工作是处理磁盘IO(大多数硬件一次只能从磁盘流传输一个块,所以这将是一个限制因素) 。然后它可以接受这个并将内存块推送到某些类型的线程池中的各个线程进行处理。

我的猜测是你的处理速度很快 - 可能比磁盘IO快得多 - 但如果它很慢,拥有多个处理线程可以加快你的整个操作。

多个FILE *指针可以正常工作 - 但实际上可能比只有一个指针慢,因为它们最终会有时间切片来读取文件,并且你会更多地在磁盘上跳转。

答案 2 :(得分:0)

如果您使用的是SSD驱动器。您可以通过使用多个文件指针并行搜索文件来解决此问题。