【发布时间】:2012-04-20 11:21:10
【问题描述】:
我有一个 c++ 程序,它使用了几个非常大的双精度数组,我想减少程序这个特定部分的内存占用。目前,我分配了 100 个,每个可以是 100 Mb。
现在,我确实有一个优势,这些数组的一部分最终会在程序执行的后期部分变得过时,并且几乎不需要在任何时候将其中任何一个都保存在内存中。
我的问题是这样的:
在我用 new 或 malloc 创建数组后,有什么方法可以告诉操作系统它的一部分不再需要了? 我得出的结论是,实现这一目标的唯一方法是声明一个指针数组,每个指针都可能指向一个块,比如 1Mb 的所需数组,以便不再需要旧块可以重新用于数组的新位。在我看来,这就像编写一个自定义内存管理器,它看起来有点像大锤,也会对性能产生一些影响
我无法移动数组中的数据,因为它会导致过多的线程争用问题。数组可以随时被大量线程中的任何一个访问,尽管只有一个线程会写入任何给定的数组。
【问题讨论】:
-
超大数组问题的答案通常是使用稀疏数组——一种看起来像数组的数据结构,但实际上只存储相关元素。如果数组的大部分是空白空间,则此方法有效。这是真的吗,或者在某些时候你真的需要给定数组中的所有元素?
-
是否可以接受特定于平台的解决方案? Posix 允许您
mmap一个大区域,然后在您完成它们后munmap部分区域。
标签: c++ optimization memory-management