C ++向量内存不足

时间:2013-03-15 17:11:58

标签: c++ memory-management memory-leaks stdvector

我有一个非常大的向量(每个数百万条,每条1024字节)。我超过了向量的最大大小(得到一个错误的内存分配异常)。我正在对项目向量进行递归操作,这需要访问向量中的其他元素。这些操作需要快速完成。我试图避免写入磁盘速度的原因。有没有其他方法来存储不需要写入磁盘的数据?如果我必须将数据写入磁盘,那么最理想的方法是什么呢?

编辑以获取更多详细信息。

我在数据集上执行的操作是基于向量中的其他数据点递归生成字符串。读入数据时会对数据进行排序。数据集范围为50,000到50,000,0000。

4 个答案:

答案 0 :(得分:9)

解决此问题的最简单方法是使用STXXL。这是对大型结构的STL的重新实现,当数据不适合内存时,它会透明地写入磁盘。

答案 1 :(得分:3)

您的问题无法在评论中说明并澄清。

您已经要求在32位系统上拥有50,​​000,000个大小为1024的条目的连续内存缓冲区。

32位系统只有4294967296字节的可寻址内存。您要求51200000000字节的可寻址内存,或者是系统内存地址空间量的11.9倍。

如果您不要求您的数据是连续的并且内存可寻址,如果您不要求您的数据全部在内存中,或者您放松了其他要求,那么您的问题可能会得到答案。即,一些操作系统通过一些hacky接口或其他操作系统暴露对与RAM相对应的非存储空间的访问(在8 gig windows系统中使用超过4 GB总RAM的方式)。

但如上所述,答案是“不,你不能那样做。”

答案 2 :(得分:0)

因为您的数据必须是连续的,并且您知道需要存储多少元素,所以只需创建一个std::vector并使用reserve()函数尝试获取所需的连续内存块大小

存储矢量的开销很小(只需几个指针来管理开头和结尾)。这和你能做的一样好。

如果失败:

  • 为您的计算机添加更多内存(如果遇到解决或实施限制,可能实际上没有帮助)
  • 切换到原始数组
  • 找到减少元素大小的方法
  • 尝试找到一个可以解决小块问题的解决方案

答案 3 :(得分:-1)

即1GB内存(1024KB * 10 ^ 6 = 1MB * 10 ^ 3 = 1GB)。理想情况下,对于32位机器,可以执行高达4GB的内存操作。 要回答您的问题,请首先尝试正常的malloc()调用并分配1 GB的内存。这应该没有任何错误。 另外,请粘贴使用向量时获得的确切错误消息。