我正在开发一个可在多核处理器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.
提前谢谢你 奏
答案 0 :(得分:4)
除非数据处理速度很慢,否则此处的限制因素将是磁盘访问,因此假设所有文件都位于同一物理磁盘上并且您没有使用SSD,我想知道多任务处理是否有用。< / p>
此外,如果您尝试并行处理多个文件,您将生成大量随机磁盘访问,这很可能比顺序访问文件慢得多。
尝试并行读写可能会在硬盘上造成同样的问题。你的HD脑袋会像疯狂一样在当前读取和写入的文件之间来回切换,大大降低了有效的磁盘带宽。
我的建议是每个物理磁盘有一个线程,首先执行所有读取操作然后执行所有写操作。您仍然可以使用工作线程来处理内存中的数据。
答案 1 :(得分:0)
正如其他人已经说过的瓶颈很可能是硬盘的I / O吞吐量。
操作系统在幕后制作了很多东西
现代操作系统在优化硬盘驱动器的使用方面提供了很多帮助,硬盘驱动器也有帮助。操作系统(Windows和Linux)将对读写进行大量缓存,并且将推测性地预读。硬盘可能会支持本机命令排队,这将大大有助于重新排序磁盘操作,以避免头部颠簸。它还有自己的缓存,至少几兆字节。
因此,您必须非常努力地处理您的代码正在执行OS和HDD尚未通过缓存等猜测或延迟的事情。
智胜操作系统
失败的一种方法是在整个文件系统中随机读取,无论是在单个文件中还是在多个文件中。你在做后者。
操作系统无法猜出您接下来要打开的文件。打开后,它会猜测你将按顺序读取文件并提前读取,它会将文件写入缓存在RAM中。但是,列表中下一个文件的初始打开和读取将会延迟,同时驱动器中的机制会慢慢地在驱动器表面上寻找正确的轨道。
帮助操作系统为您提供帮助
Kichik建议使用重叠IO来为操作系统提供关于您接下来要阅读的内容的提示。但是,这不会预示操作系统关于下一个文件。
您可能想尝试的是一次打开两个文件。第一个是您要处理的文件,第二个是您要处理的下一个文件。处理完文件1后,关闭它,打开文件3并开始处理文件2.完成2,关闭它,打开文件4.
这个想法是,通过提前打开下一个文件,你会给操作系统一个非常大的提示,告诉你接下来要读什么,并且它可能会在打开时读取文件的第一部分。我的猜测是,这个文件的初始嗅探将由操作系统完成,当它可以适应当时正在发生的任何事情时。当你真正开始从文件中读取数据时,它已经被缓存了。
如果我的猜测错了,那么你仍然可以提前打开文件,正如kichik所说,使用异步I / O告诉操作系统读取第一个数据,同时你还在忙着处理前一个文件。在处理当前文件时异步打开下一个文件会更好。