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

C++ 如何在32位机器上向向量插入100G整数?,c++,iterator,containers,standards,allocator,C++,Iterator,Containers,Standards,Allocator,假设我有100G整数,想将它们插入32位机器上的vector,可以吗 如果使用自定义分配器管理存储策略,如何确保以下操作始终有效: vector<int> coll; coll.insert(100G integers); memcpy(coll.begin() + (1024 * 1024 * 1024 * 8), "Hello", 5); vectorcoll; coll.insert(100G整数); memcpy(coll.begin()+(1024*1024*1024*8

假设我有100G整数,想将它们插入32位机器上的
vector
,可以吗

如果使用自定义
分配器管理存储策略,如何确保以下操作始终有效:

vector<int> coll;
coll.insert(100G integers);
memcpy(coll.begin() + (1024 * 1024 * 1024 * 8), "Hello", 5);
vectorcoll;
coll.insert(100G整数);
memcpy(coll.begin()+(1024*1024*1024*8),“你好”,5);

<>注意,C++标准要求存储在<代码>向量中的对象必须是连续的。code>coll.begin()+(1024*1024*1024*8)
可能是硬盘的地址。

我认为这是不可能的。无论您的分配策略如何,也不管数字物理存储在哪里,您都需要足够的地址空间为每个整数分配一个不同的内存地址。即使
sizeof(int)
为1,也需要1000亿个可用地址,而32位地址空间只有大约40亿个


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

您不能使用本机指针直接寻址100g整数,因为它们将消耗400GB的内存;一些32位操作系统可以寻址高达2、3或4 GB的RAM,大多数操作系统使用PAE可以寻址高达64 GB的RAM。尽管如此,任何32位程序都将使用32位指针,这些指针最多只能寻址4GB的RAM

所有标准STL实现(gcc的libstdc++、llvm+clang的libcxx、俄罗斯的stlport、microsoft的microsoft STL…)在STL集合中使用本机指针,并将本机(32位)大小作为集合大小

您可以尝试STL的非标准实现,例如STXXL,(),它使用磁盘(HDD)作为存储来重新实现一些STL集合。如果幸运的话,使用超大(至少需要400GB)快速SSD,您可以在几天甚至几十小时内填充矢量

STXXL的关键特性是:对并行磁盘的透明支持。 该库提供基本并行磁盘的实现 算法。STXXL是唯一的外部内存算法库 支持并行磁盘。图书馆能够处理图书馆的问题 非常大的大小(测试最高可达数十TB)

但32位平台不支持STXXL的现代版本;我不能说,任何旧版本都能在32位平台上使用如此巨大的数据。。。它使用STL的某些部分,如果有任何大小参数,您的任务将失败…

您可以尝试使用的
托管映射文件
。样本:

#include <iostream>
#include <vector>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/allocators/allocator.hpp>

int main()
{
    namespace ipc = boost::interprocess;

    using allocator_t = ipc::allocator<int, ipc::managed_mapped_file::segment_manager>;
    using vector_t = std::vector<int, allocator_t>;

    const char* filename = "tmp.dat";
    ipc::managed_mapped_file::size_type filesize = 4096;

    ipc::file_mapping::remove(filename);
    ipc::managed_mapped_file mfile(ipc::create_only, filename, filesize);

    vector_t* vec = mfile.construct<vector_t>("MyVector")(mfile.get_segment_manager());

    vec->resize(10, 42);
    for (int x : *vec) {
        std::cout << x << std::endl;
    }
}
#包括
#包括
#包括
#包括
int main()
{
名称空间ipc=boost::进程间;
使用分配器\u t=ipc::分配器;
使用vector_t=std::vector;
const char*filename=“tmp.dat”;
ipc::托管\u映射的\u文件::大小\u类型文件大小=4096;
ipc::文件映射::删除(文件名);
ipc::托管映射文件mfile(ipc::仅创建文件,文件名,文件大小);
vector_t*vec=mfile.construct(“MyVector”)(mfile.get_segment_manager());
向量->调整大小(10,42);
对于(整数x:*vec){

std::你能在一台有大量交换空间的32位机器上模拟一个64位地址空间吗?可能不是你想要的答案,但是的,这是可能的。@Mystical,你是如何“模拟”的当指针只能容纳32位时,64位地址空间?当您谈论虚拟地址空间时,RAM与交换是不相关的。@Wyzard OP说“32位机器”。OP没有说32位程序。你可以编译一个64位二进制文件,在32位硬件上使用交换空间在模拟器中运行。@神秘,公平点,但在这种情况下,我认为你实际上是在64位机器上运行程序(模拟器提供的机器)。事实上,这台机器是用另一台计算机上的代码而不是物理硅构建的,这一点无关紧要。一旦创建了400GB的数据,你会如何处理它?嗯,pdf中的示例看起来很有希望(1000万个结构):
stxxl::vector Edges(1000000000ull)
.Akira Takahashi,你确定这将允许std::vector索引超过4G个元素吗?例如,在gcc-4.6中的libstdc++中,“
size\u type
”类型为`typedef size\u t size\u type;`在标准32位x86平台上是32位的。我知道,
size\u type
是在C++(11)中定义的实现标准。因此,我们可以使用Boost.Container的
向量
向量
大小类型
分配器