c++向量内存不足



我有一个非常大的向量(数百万个条目,每个1024字节)。我超过了向量的最大大小(得到一个坏的内存分配异常)。我正在做一个递归操作,它需要访问向量中的其他元素。手术必须尽快完成。出于速度原因,我尽量避免写入磁盘。是否有其他不需要写入磁盘的方法来存储这些数据?如果我必须将数据写入磁盘,最理想的方法是什么>

编辑更多细节。

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

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

你的问题不能像评论中所说的那样解决。

你已经请求了一种方法在32位系统上有一个连续的50,000,000个条目大小为1024的内存缓冲区。

一个32位系统只有4294967296字节的可寻址内存。您正在请求5200000000字节的可寻址内存,或者是系统上内存地址空间的11.9倍。

如果你不要求你的数据是连续的和内存可寻址的,如果你不要求你的数据一次都在内存中,或者如果你放松其他要求,你的问题可能有一个答案。例如,一些操作系统通过一些黑客接口或其他方式暴露对非内存空间的访问,这些非内存空间的值对应于RAM(在8g的windows系统中有方法使用超过4g的总RAM)。

但如前所述,答案是"不,你不能那样做"。

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

存储vector的开销很小(只有几个指针来管理开始和结束)。这是你能做的最好的了。

如果失败:

  • 为您的机器添加更多内存(如果您遇到寻址或实现约束,可能实际上没有帮助)
  • 切换到原始数组
  • 找到一种方法来减少元素的大小
  • 试图找到一个解决方案,可以解决小块的问题

这是1GB内存(1024KB * 10^6 = 1MB * 10^3 = 1GB)。理想情况下,32位机器最多可执行4GB内存操作。要回答您的问题,首先尝试正常的malloc()调用并分配1 GB的内存。这样做应该没有任何错误。此外,请粘贴准确的错误信息,你得到,而使用矢量。

最新更新