【问题标题】:Writing data to disk in parallel?将数据并行写入磁盘?
【发布时间】:2013-08-16 00:50:30
【问题描述】:

所以我正在开发一个 C++/cli 图像处理库并尝试优化我的代码。基本上,我传递了一个图像的 System::Drawing::Bitmap,然后我需要将其写入磁盘,执行复杂分析,并返回分析结果。我认为我可以将图像并行写入磁盘以加快速度(我的算法不会修改图像)。但是,我没有过多地使用线程,所以我想请您就如何做到这一点的最佳方式征求您的意见。

string ProcessImage(System::Drawing::Bitmap ^bmp, System::String^ targetFile)
{
    bmp->Save(targetFile);
    System::Drawing::Bitmap^ bmp8 = BitmapConvertPixelFormat(bmp, 8); //<-- a function I wrote which converts the 32bpp I am passed into an 8bpp one
    string results = Analyze(bmp8); //<--- takes a good bit of time
    return results;
}

请告诉我你的想法。 提前谢谢!

【问题讨论】:

  • 需要更多规范。您是要 (1) 写入在分析开始之前可用的数据,(2) 在分析进行时写入由分析生成的数据,还是 (3) 写入仅在分析完成后才可用的数据?还是完全不同的东西?
  • @JustJeff:从他提供的示例代码来看,我相信是 (1) 的情况。这是一个微不足道的情况,线程可以在没有太多工作的情况下提供帮助。
  • @LieRyan - 同意。仍然希望OP确认
  • 这毫无意义。您可能有多个内核,但仍然只有一个磁盘。当图像不超过 1 GB 左右时,它仍然是内存到内存的副本,具体取决于文件系统缓存的大小。

标签: multithreading image-processing c++-cli


【解决方案1】:

对单个机械磁盘进行并行写入/读取并不是一个好主意,因为机械磁头每次都需要旋转以服务 I/O 请求,因此使用多个线程只会不必要地反弹它并产生开销.

您可以尝试进行一些基准测试,但恐怕您只能求助于使用单线程并按顺序编写。

【讨论】:

  • 不是真的。在几乎任何重要的操作系统中,您的磁盘读取/写入都由操作系统缓冲。
  • @Lie Ryan:即使 I/O 请求被缓冲并稍后发出,即使它们会以某种方式以最佳模式重新排序(这是一厢情愿的想法),它仍然最多与单个编写器线程一样高效。
  • 我认为 OP 的意思是“执行复杂分析”与磁盘写入并行,而不是在写入另一部分的同时写入一部分输出。
  • @JustJeff:好点。现在我又读了一遍,不清楚他的意思是“并行写入图像”还是“与分析并行写入图像”。
  • 我从实践中知道这个答案是正确的。至少 Windows 不会优化多线程的写入。尝试同时复制两个文件,看看我的意思。吞吐量被破坏
【解决方案2】:

将磁盘写入排队到另一个线程似乎是一个好主意,但每个磁盘只有一个写入器线程,这样复杂的分析就可以在没有缓慢的磁盘写入阻碍的情况下继续运行。

【讨论】:

  • 没什么可同步的,因为分析代码不会修改数据。将分析输入数据写入磁盘,而不是输出,因此它们可以并行进行。关于数据的生命周期管理,OP 没有提供任何约束,所以我懒得提了。如果必须在这些操作之后删除()数据,那么我可能会使用原子 refCount 以便分析/编写器的最后一个完成删除数据对象。
【解决方案3】:

如果值得的话,您可以花一些时间来了解如何使用Parallel HDF5。它可以并行写入文件。

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2017-04-24
    • 1970-01-01
    • 2011-12-13
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2012-01-15
    相关资源
    最近更新 更多