为 std::vector 分配几 GB 的内存

Allocate several GBs of memory for std::vector

我需要从传感器获取几 GB 的数据。当我尝试使用 malloc(10 GB 或更多 GB。我的系统有 32GB)分配一个大数组时,它 returns NULL。所以我认为这个问题可以用向量的迭代器链表来解决。

但是我不知道如何设置它。我试着声明“ list< vector::iterator >”但是我不能为每个向量分配内存(e/o 应该有 1000~2000 个元素)。你知道有什么方法可以做到这一点或者对于这个大的更好的解决方案吗内存分配?

如果您使用的是 64 位操作系统,那么 malloc 应该可以毫无问题地分配大容量。

例如,这段代码在我的 windows 机器(64 位 windows)上运行并完美地分配了 10GB 的内存:

#include <stdio.h>
#include <malloc.h>
int main(int argc, char *argv[]) {
    long int size = 10L * 1024 * 1024 * 1024;
    printf("size = %ld\n", size);
    char *x = (char *)malloc(size);
    printf("x = 0x%lx\n", x);
    long int i;
    for (i = 0; i < size; i += 1024*1024) {
        x[i] = 'h';
    }
    printf("Done1\n");
}

但是,如果您使用的是 32 位操作系统,就会遇到麻烦,并且无法分配超过某个限制(可能是 3 GB,但可能取决于系统)

在这种情况下,您需要将数据写入文件。

但是,如果您使用的是胖文件系统,那么您也无法写入那么大的文件。在这种情况下,您必须将数据拆分为多个 2gb 以下的文件。

您需要实际检查 malloc 结果是否为 NULL,以确保 malloc 工作并且可以获取内存。

对于这种数据量,我通常移动到内存映射文件或共享内存映射。

这样,您就完全不受可用物理(进程)内存量的限制。您可以根据需要让 OS 页面进出。碎片变得不再是一个问题(除非你真的对逻辑地址进行碎片化 space,这在 64 位架构上很难实现)。


更多信息

我有很多关于 SO 的答案,这些答案显示了在共享 memory/mapped 文件中存储向量和各种更复杂的数据结构的示例。您可能想要查找 mapped_file_device(来自 Boost Iostreams)或 managed_shared_memorymanaged_mapped_file(来自 Boost Interprocess)

您需要在 Windows 64 位 OS 下分配此 space。您还必须设置 "large address space aware" 标志,否则由于虚拟内存系统在 Windows.

上的工作方式,您只能获得 2 GB 的 RAM

如果您不是绝对需要一大块 10 GB 的连续内存,您可能需要考虑使用内存映射文件,正如 sehe 在他的回答中所建议的那样。如果您必须为 Windows 32 位构建应用程序,那么这将是唯一的答案,因为 Windows 32 位通常只允许 2 GB 内存,除非为 [=14 设置了该选项=] 标志,此时它将允许使用 3 GB 的内存。

当您必须处理大块内存时,最好完全跳过 malloc 并直接转到操作系统调用内存分配。