5

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

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

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

4

4 回答 4

9

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

于 2013-03-15T17:19:34.180 回答
3

您的问题无法按照评论中所述和澄清的方式解决。

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

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

如果您不要求您的数据是连续的和内存可寻址的,如果您不要求您的数据一次都在内存中,或者如果您放宽其他要求,那么您的问题可能会有答案。即,一些操作系统通过一些hacky接口或其他方式公开访问与RAM相对应的值的非内存空间(在8 gig windows系统中使用超过4 gigs总RAM的方法)。

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

于 2013-03-15T17:48:14.940 回答
0

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

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

如果失败:

  • 为您的机器添加更多内存(如果您遇到寻址或实现限制,可能实际上没有帮助)
  • 切换到原始数组
  • 找到减小元素大小的方法
  • 尝试找到可以解决小块问题的解决方案
于 2013-03-15T17:37:33.460 回答
-1

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

于 2013-03-15T17:16:29.620 回答