Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化数据结构,使其充分利用虚拟内存_C++_Performance_Opencv_Caching_Memory Management - Fatal编程技术网

C++ 优化数据结构,使其充分利用虚拟内存

C++ 优化数据结构,使其充分利用虚拟内存,c++,performance,opencv,caching,memory-management,C++,Performance,Opencv,Caching,Memory Management,我想知道如何优化openCV(特别是mat类型)中的数据结构,以便能够利用内置内存/虚拟内存管理的操作系统 对于完整的背景,请阅读Q和a,否则情况可以总结为我有大量的垫子,我需要随意快速地访问。主要的复杂性是,完整的数据量远远高于可用的RAM量 (*从概念上讲,数据是一个递归定义的3D数组,但我们不要因为这种混淆而弄脏了水!) 与其构建我自己的LRU缓存和RAM饥饿和低效的“页面”寻址策略来访问它,我宁愿让操作系统为我做这件事 我想我了解这些概念,但当涉及到实际的实现时,我只是在胡闹: >

我想知道如何优化openCV(特别是mat类型)中的数据结构,以便能够利用内置内存/虚拟内存管理的操作系统

对于完整的背景,请阅读Q和a,否则情况可以总结为我有大量的垫子,我需要随意快速地访问。主要的复杂性是,完整的数据量远远高于可用的RAM量

(*从概念上讲,数据是一个递归定义的3D数组,但我们不要因为这种混淆而弄脏了水!)

与其构建我自己的LRU缓存和RAM饥饿和低效的“页面”寻址策略来访问它,我宁愿让操作系统为我做这件事

我想我了解这些概念,但当涉及到实际的实现时,我只是在胡闹:

    > P>这是一个通用C++考虑,还是我需要在OpenCV级别上处理的?

  • 它是否像使数据的粒度接近(但不超过)4KB那样简单?(参见4KB激励的解决方案)

  • 如何在磁盘上实际保存、访问和表示mat?(这是怎么涉及的?)

这是一个通用C++考虑,还是我需要在OpenCV级别上处理的?< /P> 您只需分配和使用大量内存分页/虚拟内存的全部意义在于它是完全透明的。一切都变得非常缓慢,但仍在继续工作。在交换空间+RAM用完之前,您不会得到

ENOMEM

在普通的Linux系统上,您的普通交换分区应该非常小(低于1GB),因此您可能需要
dd
交换文件,并在其上
mkswap
/
swapon
。确保交换文件仅对根用户具有读写权限。显然,每个主要的操作系统都有自己的程序

它是否像使数据的粒度接近(但不超过)4KB那样简单?(有关4KB的动机,请参见此处的解决方案)

如果您有指向其他数据的指针,请确保将它们放在一起。您希望所有的小“热”数据只在几个页面中,而一个像样的OS LRU算法不会将其分页

如果热数据和冷数据混合在一起,它很容易被调出,并导致额外的页面文件往返,甚至在最终数据的缓存丢失发生之前

正如雅克所说,顺序访问模式会做得更好,因为磁盘I/O在多块读取时做得更好。(即使SSD具有更大数据块的更好吞吐量)。这还允许预取,即允许在前一个I/O请求的数据到达之前启动一个I/O请求。最大化I/O吞吐量需要流水线请求

在可能的情况下,尝试设计算法进行顺序访问。这对于所有级别的内存都是有利的,从分页一直到一级缓存。顺序访问甚至可以使用向量寄存器实现自动向量化

这些技术也适用于缺页。谷歌提供详细信息,但主要思想是在数据子集上执行算法的所有步骤,而不是在每个步骤中接触所有数据。然后,每段数据只需加载到缓存中一次,而不是在算法的每个步骤中加载一次

可以将DRAM看作是巨大虚拟地址空间的缓存


如何在磁盘上实际保存、访问和表示mat?(这就是内存映射的方式?)


。因此,是的,这与通过大文件分配内存而不是匿名分配内存非常相似。

如果您能够管理访问模式,比如从头到尾读取1 mb的线性地址空间,那么操作系统将非常擅长预测您接下来要读取的内容,并提前为您读取。但实际上,过了某一点,您将受到磁盘io的限制(除非您使用的是高速硬盘存储);所以你的目标是避免重复阅读(好吧,在阅读一段时间后停止阅读,以避免重读)。基本上,试着抵制武断。这里的任何改进都可能主导您所能做的任何事情。@Yakk,“避免多次读取内容”:这就是LRU/LFU缓存所要管理的——据我所知,内存管理背后的算法中隐含着这种功能。