如何在32位机器上的向量中插入100G整数?

xml*_*lmx 4 c++ standards containers iterator allocator

假设我有100G整数,并希望将它们插入到vector<int>32位机器上,是否可能?

如果我使用自定义allocator来管理存储策略,那么如何保证以下操作始终有效:

vector<int> coll;
coll.insert(100G integers);
memcpy(coll.begin() + (1024 * 1024 * 1024 * 8), "Hello", 5);
Run Code Online (Sandbox Code Playgroud)

请注意,C++标准要求存储在a中的对象vector必须是连续的.coll.begin() + (1024 * 1024 * 1024 * 8)可能是硬盘的地址.

osg*_*sgx 9

您不能使用本机指针直接处理100 G的整数,因为它们将消耗400 GB的内存; 某些32位操作系统最多可以处理2,3或4 GB的RAM,大多数情况下使用PAE可以达到64 GB.但是,任何32位程序都将使用32位指针,只能处理高达4 GB的RAM.

所有标准STL实现(来自gcc的libstdc ++,来自llvm + clang的libcxx,来自russia的stlport,来自microsoft的microsoft stl ......)在STL集合中使用本机指针,并使用本机(32位)size_t作为集合大小.

您可以尝试非标准的STL实现,例如STXXL,http://stxxl.sourceforge.net/ (介绍幻灯片),它使用磁盘(HDD)作为存储重新实现一些STL集合.如果幸运的话,你可以在几天甚至几十小时内使用巨大的(至少需要400GB)快速SSD.

STXXL的主要功能包括:并行磁盘的透明支持.该库提供了基本并行磁盘算法的实现.STXXL是唯一支持并行磁盘的外部存储器算法库.该库能够处理非常大的问题(测试高达几十TB).

但是32位平台不支持现代版本的STXXL; 我不能说,任何旧版本都可以在具有如此庞大数据的32位平台上运行......它使用STL的某些部分,如果有任何size_t大小的参数,您的任务将失败......


Wyz*_*a-- 7

我不认为这是可能的.无论您的分配策略或数字的物理存储位置如何,您都需要足够的地址空间来为每个整数分配不同的内存地址.即使sizeof(int)是1,你也需要1000亿个地址,而32位地址空间只有40亿个.

您可以将数据存储在不暴露项目地址的其他类型的容器中,并且可以在内部使用银行切换方案根据需要加载数据的子集.但是std::vector暴露存储在其中的项目的内存地址,因此每个项目都需要始终具有有效的内存地址(无论该地址是由RAM还是交换空间支持).