【发布时间】:2016-08-10 23:13:57
【问题描述】:
我想知道如何优化 openCV 中的数据结构(特别是 mat 类型),以便我能够利用内置于内存/虚拟内存管理中的操作系统。
有关完整的上下文,请阅读 Q 和 A here - 但否则情况可以总结为我有大量的垫子* 我需要访问 任意和快速。主要的复杂性是全部数据量远高于可用 RAM 量。
(*从概念上讲,数据是递归定义的 3D 数组的 3D 数组,但我们不要因为这种混淆而搅浑水!)
与其构建我自己的 LRU 缓存和大量 RAM 且效率低下的“页面”寻址策略来访问它,我宁愿让操作系统为我做这件事。
我想我明白了这些概念,但是当谈到实际的实现时,我只是在摆弄拇指:
这是一个通用的 C++ 考虑因素,还是我需要在 openCV 级别解决的问题?
是否像使数据的粒度接近(但不超过)4KB 一样简单? (有关 4KB 动机,请参阅解决方案 here)
- 实际如何在磁盘上保存、访问和表示垫子? (这就是memory-mapping的参与方式吗?)
【问题讨论】:
-
如果您可以管理访问模式,例如从头到尾读取 1 mb 的线性地址空间,操作系统将非常擅长预测您接下来要阅读的内容,并提前为您阅读.但实际上,过了某个时间点,您将受到磁盘 io 的限制(除非您正在使用疯狂的快速硬盘存储);因此,您在该限制下的目标是避免多次阅读内容(好吧,稍后停止阅读以避免颠簸)。基本上,尝试反击任意。那里的任何改进都可能支配您可以做的任何其他事情。
-
@Yakk,“避免多次阅读内容”:这就是 LRU/LFU 缓存的工作原理——据我所知,这种功能隐含在内存管理背后的算法中。跨度>
标签: c++ performance opencv caching memory-management