c – 读取图像序列的最快方法是什么?
我有一个速度关键程序,它将重复从磁盘读取图像并从中计算值.图像太多,无法存储在内存中.
将读取相同的图像集,我们不会更改/编辑它们,并且它们的顺序是固定的. 并非所有图像都具有相同的大小,但是当编码为PNG时它们都具有大约1 Mb.它们有成千上万,大部分RAM已经用于存储计算值.
将它们全部放在一个大的tar文件中(并使用自定义的解码代码读取它们)而不是文件夹中的单个文件会更快吗? 我找不到PNG解码的多线程实现,所以这个阶段也可能成为瓶颈.使用WebP而不是PNG会提供额外的速度优势吗? 我应该考虑/评估哪些其他想法? 解决方法
PNG不是为了速度而建.它比jpeg慢,并且不小于tif.如果你坚持使用PNG,那么其他任何优化都不会产生任何影响.
例如: $time vips avg wtc.tif 117.853995 real 0m0.525s user 0m0.756s sys 0m0.580s $time vips avg wtc.png 117.853995 real 0m3.622s user 0m3.984s sys 0m0.584s 其中“wtc”是10,000 x 10,000像素RGB照片,tif是未压缩的条带格式,png也是未压缩的,两个图像都在光盘缓存中,“avg”找到并打印平均像素值. vips有自己的“.v”格式,这只是一个巨大的像素缓冲区.这种格式可以与mmap()并行读取,并且再次快一点: $time vips avg wtc.v 117.853995 real 0m0.162s user 0m0.460s sys 0m0.092s 如果你的图像可以被压缩,那么权衡会有所改变.例如,jpeg通常压缩10倍,因此解码速度变得比光盘速度重要得多.您希望使用像libturbojpeg这样的优化解码库并一次处理多个文件. $time vips avg wtc.jpg 117.853995 real 0m1.413s user 0m1.696s sys 0m0.564s PNG使用libz,对于摄影图像,压缩不会超过2倍.即使在相同的压缩级别,它也比使用deflate的tif慢得多: $time vips avg wtc.tif 117.853995 real 0m3.154s user 0m3.496s sys 0m0.540s $time vips avg wtc.png 117.853995 real 0m4.888s user 0m5.196s sys 0m0.556s $ls -l wtc.* -rw-r--r-- 1 john john 15150881 Feb 20 2012 wtc.jpg -rw-rw-r-- 1 john john 135803013 May 18 12:47 wtc.png -rw-rw-r-- 1 john john 143807446 May 18 12:53 wtc.tif -rw-rw-r-- 1 john john 263509369 May 18 12:37 wtc.v 我想另一个因素是你的处理是多么耗时.如果你正在做一些密集的事情,读取速度和解码速度将不重要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |