繁体   English   中英

C ++程序中的内存使用情况

[英]Memory usage in C++ program

我编写了一个程序,该程序需要使用以下库来处理非常大的数据:

  • 向量
  • boost :: unordered_map
  • boost :: unordered_multimap

所以,我遇到了内存问题(程序使用了很多),我在想也许我可以替换这个库(用已经存在的东西或我自己的实现):

因此,三个问题:

  • 如果将向量替换为C数组,我将节省多少内存? 这值得么?
  • 有人可以解释一下当前实现中boost :: unordered_map和boost :: unordered_multimap中使用的内存吗? 就像为了达到目的而存储的内容。
  • 您能否向我推荐一些在内存使用方面优于boost :: unordered_map和boost :: unordered_multimap的库(但不要太慢)?

std::vector可以提高内存效率。 我不了解增强贴图,但是增强贴图的人通常都知道他们在做什么,我怀疑您通过创建自己的变体会节省很多内存。

您可以做一些其他事情来解决内存问题:

  1. 以64位编译。 在64位进程中用尽内存非常困难。
  2. 您不会用完内存,但是内存可能会被换出。 相反,您应该查看是否需要一次将所有内容加载到内存中,也许您可​​以一次处理大量数据。
  3. 附带的好处是,一次处理大量数据可让您并行运行代码。

由于当今的内存是如此便宜,因此分配10GB RAM非常简单,我想您的瓶颈将在于处理数据而不是分配数据。

这两篇文章介绍了无序关联容器的一些常见实现所基于的数据结构:

即使实现之间存在一些差异,它们也很适中-每个元素最多一个字。 如果使用最小开销的解决方案(例如排序向量),则每个元素将获得2-3个字,如果您的对象很大,则甚至不会提高2倍。 因此,最好是诉诸具有更多内存的环境,或者通过使用数据库或其他方法彻底改变您的方法。

std :: vector本质上是一个连续的数组,外加几个字节的开销。 关于向量的唯一改进方法是使用较小的元素类型。 您可以存储短整数而不是常规整数吗? 如果是这样,您可以将向量存储器减少一半。

您是否正在使用这些容器来保存指向堆上许多对象的指针? 如果是这样,您可能会在堆中浪费大量空间,这些空间可以通过编写自定义分配器或完全取消指向堆元素的指针以及在容器中存储值类型来节省。

查看您的班级类型。 考虑所有指针类型,以及是否需要动态存储它们。 典型的类通常具有悬挂在基础对象上的指针成员,这意味着单个对象本身就是内存块的图形。 您可以内联类成员的次数越多,使用堆的效率就越高。

RAM在2014年是便宜的。如果您当前使用的存储盒并未为该项目节省空间,则可以轻松构建具有64-256GB RAM和固态磁盘的x86-64英特尔存储盒,作为快速交换。 希望这不是我们正在讨论的商用台式机应用程序。 :)

如果您只有一组数据和多种访问方式,则可以尝试使用boost::multi_index这是文档

最后,我将vector std::unordered_map更改为boost::unordered_multimap

boost::unordered_multimap消耗的vector std::unordered_map所消耗的内存是其vector两倍以上,这是因为它保留了额外的指针(每个元素至少一个额外的指针),并且事实是它存储了键和每个元素的值,而vector unordered_map仅对包含所有碰撞元素的vector存储一次密钥。

在我的特定情况下,我试图存储大约4百万个整数,在理想情况下会消耗大约15 GB的内存。 使用多图时,我消耗了超过40 GB的内存,而使用图时,我则消耗了约15 GB的内存(由于指针和其他结构的原因要多一些,但如果卑鄙的话,它们的大小)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM