在c ++中同时处理多个文件

时间:2015-03-21 04:03:29

标签: c++ multithreading multicore

我正在开发一个可在多核处理器PC上运行的VC6项目。我们需要处理大量文件。我将使用多个线程来处理它们。我需要专家的建议才能继续。据我所知,这是数据并行的例子。情节是这样的。

文件描述:=

文件结构完全相同,但它们的名称是任意的。

每个大约100 kb。

文件编号从几百到几千不等。

每个文件的处理方式完全相同。

对于每个文件,

我将从HDD中读取 - >过程 - >写入硬盘

保存可能在同一个文件中,也可能是同名的不同文件夹(目前未决定如此忽略)

我正在考虑使用多个线程来处理文件。因此每个核心将处理一个文件。 (我知道文件处理,线程创建,获取核心数量)

DOUBT 1。

现在给出1500个文件和2/4/8内核我应该如何在多个线程之间平均分配文件(appox。),以便每个文件只处理一次。

DOUBT 2。 我只有一个硬盘驱动器,因此I / O可以创建多少个线程。

One thread for doing both Input and output 
OR 
Two threads, One for reading and one for writing.

提前谢谢你 奏

2 个答案:

答案 0 :(得分:4)

除非数据处理速度很慢,否则此处的限制因素将是磁盘访问,因此假设所有文件都位于同一物理磁盘上并且您没有使用SSD,我想知道多任务处理是否有用。< / p>

此外,如果您尝试并行处理多个文件,您将生成大量随机磁盘访问,这很可能比顺序访问文件慢得多。
尝试并行读写可能会在硬盘上造成同样的问题。你的HD脑袋会像疯狂一样在当前读取和写入的文件之间来回切换,大大降低了有效的磁盘带宽。

我的建议是每个物理磁盘有一个线程,首先执行所有读取操作然后执行所有写操作。您仍然可以使用工作线程来处理内存中的数据。

答案 1 :(得分:0)

正如其他人已经说过的瓶颈很可能是硬盘的I / O吞吐量。

操作系统在幕后制作了很多东西

现代操作系统在优化硬盘驱动器的使用方面提供了很多帮助,硬盘驱动器也有帮助。操作系统(Windows和Linux)将对读写进行大量缓存,并且将推测性地预读。硬盘可能会支持本机命令排队,这将大大有助于重新排序磁盘操作,以避免头部颠簸。它还有自己的缓存,至少几兆字节。

因此,您必须非常努力地处理您的代码正在执行OS和HDD尚未通过缓存等猜测或延迟的事情。

智胜操作系统

失败的一种方法是在整个文件系统中随机读取,无论是在单个文件中还是在多个文件中。你在做后者。

操作系统无法猜出您接下来要打开的文件。打开后,它会猜测你将按顺序读取文件并提前读取,它会将文件写入缓存在RAM中。但是,列表中下一个文件的初始打开和读取将会延迟,同时驱动器中的机制会慢慢地在驱动器表面上寻找正确的轨道。

帮助操作系统为您提供帮助

Kichik建议使用重叠IO来为操作系统提供关于您接下来要阅读的内容的提示。但是,这不会预示操作系统关于下一个文件。

您可能想尝试的是一次打开两个文件。第一个是您要处理的文件,第二个是您要处理的下一个文件。处理完文件1后,关闭它,打开文件3并开始处理文件2.完成2,关闭它,打开文件4.

这个想法是,通过提前打开下一个文件,你会给操作系统一个非常大的提示,告诉你接下来要读什么,并且它可能会在打开时读取文件的第一部分。我的猜测是,这个文件的初始嗅探将由操作系统完成,当它可以适应当时正在发生的任何事情时。当你真正开始从文件中读取数据时,它已经被缓存了。

如果我的猜测错了,那么你仍然可以提前打开文件,正如kichik所说,使用异步I / O告诉操作系统读取第一个数据,同时你还在忙着处理前一个文件。在处理当前文件时异步打开下一个文件会更好。