【问题标题】:Processing multiple files concurrently in c++在 C++ 中同时处理多个文件
【发布时间】:2015-03-21 04:03:29
【问题描述】:

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

文件说明:=

文件结构完全相同,但名称随意。

每个大小约为 100 kb。

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

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

对于每个文件,

我将从硬盘读取 -> 进程 -> 写入硬盘

保存可能在同一个文件中,也可能是同名的不同文件夹(目前没有决定所以忽略)

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

怀疑 1。

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

怀疑 2。 我只有一个 HDD,所以要为 I/O 创建多少线程。

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

提前谢谢你 金手

【问题讨论】:

  • 你也可以考虑overlapped asynchronous operations来省去穿线的麻烦。
  • 只有一个 HDD,除非处理文件内容需要相当长的时间,否则磁盘 IO 将成为您的瓶颈,并且使用多个线程不会提高应用程序的整体运行时间。跨度>

标签: c++ multithreading multicore


【解决方案1】:

除非数据处理非常慢,否则这里的限制因素将是磁盘访问,因此假设所有文件都在同一个物理磁盘上并且您没有使用 SSD,我想知道多任务处理是否会有所帮助。

此外,如果您尝试并行处理多个文件,则会产生大量随机磁盘访问,这很可能比顺序访问文件要慢得多。
尝试并行读取和写入可能会在硬盘上导致相同的问题。您的 HD 磁头会疯狂地在当前读取和写入的文件之间来回移动,从而显着降低有效磁盘带宽。

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

【讨论】:

    【解决方案2】:

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

    操作系统在幕后做了很多事情

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

    因此,您必须非常努力地遇到这样一种情况,即您的代码正在执行操作系统和 HDD 尚未猜到或因缓存等原因而延迟的事情。

    智取操作系统

    解决这个问题的一种方法是在整个文件系统中随机读取,无论是在单个文件中还是跨多个文件。你在做后者。

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

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

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

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

    这个想法是,通过提前打开下一个文件,您可以向操作系统提供一个非常重要的提示,即您接下来将要阅读的内容,并且它很可能会在打开时读取文件的第一部分。我的猜测是,文件的初始嗅探将由操作系统完成,因为它可以安装在当时正在发生的任何事情中。当你真正开始从文件中读取数据时,它已经被缓存了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多