C++ C++;向量内存不足
我有一个非常大的向量(数百万个条目,每个1024字节)。我超过了向量的最大大小(得到一个坏内存alloc异常)。我正在对项的向量执行递归操作,这需要访问向量中的其他元素。操作需要快速完成。由于速度原因,我试图避免写入磁盘。是否有其他不需要写入磁盘的方式来存储此数据?如果必须将数据写入磁盘,最理想的方法是什么> 编辑以获取更多详细信息 我对数据集执行的操作是基于向量中的其他数据点递归地生成字符串。数据在读入时进行排序。从50000到500000000的数据集。即1GB内存(1024KB*10^6=1MB*10^3=1GB)。理想情况下,对于32位机器,最多可以执行4GB内存操作。 要回答您的问题,请首先尝试一个普通的malloc()调用并分配1GB内存。这样做应该没有任何错误。C++ C++;向量内存不足,c++,memory-management,memory-leaks,stdvector,C++,Memory Management,Memory Leaks,Stdvector,我有一个非常大的向量(数百万个条目,每个1024字节)。我超过了向量的最大大小(得到一个坏内存alloc异常)。我正在对项的向量执行递归操作,这需要访问向量中的其他元素。操作需要快速完成。由于速度原因,我试图避免写入磁盘。是否有其他不需要写入磁盘的方式来存储此数据?如果必须将数据写入磁盘,最理想的方法是什么> 编辑以获取更多详细信息 我对数据集执行的操作是基于向量中的其他数据点递归地生成字符串。数据在读入时进行排序。从50000到500000000的数据集。即1GB内存(1024KB*10^6=
另外,请粘贴使用矢量时获得的准确错误消息 解决这个问题最简单的方法是使用。它是STL的一个重新实现,用于大型结构,当数据无法放入内存时,可以透明地写入磁盘。因为数据必须是连续的,并且您知道需要存储多少元素,只需创建一个
std::vector
并使用reserve()
函数,尝试获取所需大小的连续内存块
存储向量的开销很小(只有几个指针来管理开始和结束)。这是你能做的最好的了
如果失败:
- 向计算机添加更多内存(如果遇到寻址或实现限制,可能实际上没有帮助)
- 切换到原始数组
- 找到一种减小元素大小的方法
- 试着找到一个可以小规模解决问题的解决方案
但如前所述,答案是“不,你不能那样做”。我们不能在不了解更多数据的情况下说任何话。无论你在做什么,你都需要连续内存吗?如果不是,一个简单的改变就是使用
std::deque
;它应该允许您在内存耗尽之前存储更多的元素。std::vector
的大多数实现使用容量加倍的重新分配策略,这意味着如果您的向量增长很多,它可能使用了比存储实际可寻址元素所需的存储空间多得多的存储空间。感谢您的输入。32位内存空间,即每数据块1024字节,意味着2^22
项的理论上限(实际上限远小于此值,因为并非所有内存空间都是此容器)。这仅仅是420万个元素。您要求在32位操作系统上提供包含“数百万”1024字节元素的连续内存缓冲区——答案是“不,您不能这样做”。放松一些,你就能解决它。确切地说,为什么您需要连续的?OP在问题中给出的唯一有用的信息是他看到了什么错误-坏内存alloc异常,也就是使用malloc是一个答案:)这是一个错误的答案。问题是数百万,而不是一百万。即使假设只有200-300万,也不能保证32位机器可以分配2-3 GB的连续地址空间。一些地址空间将用于内核、共享库、堆栈等。问题还包括“数百万”1024字节。如果数据必须是连续的,STXXL将如何帮助?任何类型的磁盘写入(透明或非透明)都会破坏连续性。@Yakk,它不是真正连续的,它只是显示与std::vector
相同的接口。问题没有要求它是连续的,或者至少在我发布答案时没有。@DirkHolsopple是的,提问者在问题的评论中添加了这个约束。@Yakk,也许“我需要无限连续内存”这不是一个合理的要求。如果用户允许有足够的虚拟内存,那么在现代操作系统上,将内存添加到向量的最大大小将毫无用处。分配是消耗地址空间,而不是内存。即便如此,操作系统仍然可以分配比其虚拟内存更多的地址空间,并且只有在实际修改内存时才会失败。这正是我所想的。谢谢,我就是这么想的。谢谢。@user2174896说清楚,我的回答是“你问错了问题”,而不是“你不能解决你的实际问题”。我强烈怀疑您的实际问题是“32位操作系统上51200000000字节的连续内存空间”