【发布时间】:2013-05-12 16:43:50
【问题描述】:
我有一个速度关键的程序,它将反复读取磁盘中的图像并从中计算值。图像太多,无法存储在内存中。
将读取同一组图像,我们不会更改/编辑它们,它们的顺序是固定的。
并非所有图像都具有相同的大小,但它们在编码为 PNG 时都有大约 1 Mb。它们有数万个,并且大部分 RAM 已用于存储计算值。
除了购买更快的磁盘或使用 RAID,读取图像序列的最快方法是什么?
将它们全部放在一个大的 tar 文件中(并使用自定义解压缩代码读取它们)而不是作为文件夹中的单个文件会更快吗?
我找不到PNG解码的多线程实现,所以这个阶段也可能成为瓶颈。使用 WebP 代替 PNG 会提供额外的速度优势吗?
我应该考虑/评估哪些其他想法?
【问题讨论】:
-
如果我猜的话,没有比一本一本阅读更快的方法了。考虑一下,瓶颈将是磁盘访问,并且没有办法解决它......我唯一想到的就是选择一种图像格式,它可以减少磁盘-> cpu 传输的开销。解码图像可能比从磁盘读取文件快很多。
-
您是否尝试过任何替代方法并获得了一些分析结果?使用 SSD 磁盘是一种选择吗?
-
也许您应该阅读它们一次,计算您需要的任何值/信息,然后存储该信息,这样您就不必再次阅读所有图像(至少直到图像或您需要从中计算出的信息会发生变化)。
-
@twalberg 这当然是一个选项,但我计算的确切数据会定期更改,结果会比原始图像更大。与在飞行中重新计算数据相比,写入和读取所有数据会更慢。
-
@IanMedeiros:将图像打包到单个文件中可能会更快,因为防病毒软件(如果存在)可能会扫描您打开的每个文件。如果您打开文件一次,就会有一次检查。如果你打开很多文件,就会有多个检查。
标签: c++ image performance io