我需要从传感器获取几GB的数据。当我尝试使用malloc(10或更多GB。我的系统有32GB)分配一个大数组时,它返回NULL。所以我认为问题可以通过向量的迭代器链接列表来解决。
但是我不知道如何设置它。我试着宣布" 列表< vector :: iterator>"但是我无法为每个向量分配内存(e / o应该有1000~2000个元素)。你知道有什么方法可以做这个或者更好的解决这个大内存分配的方法吗?
答案 0 :(得分:3)
如果您使用的是64位操作系统,那么malloc应该能够分配大尺寸而没有任何问题。
例如,此代码在我的Windows机器(64位窗口)上运行,并且完美地分配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正常工作并且可以抓取内存。
答案 1 :(得分:0)
我通常会转移到这种数据卷的内存映射文件或共享内存映射。
这样,您就不会受到可用的物理(进程)内存量的限制。您可以根据需要进入和退出操作系统页面。碎片变得不那么重要了(除非你实际上碎片化逻辑地址空间,这在64位体系结构上很难实现)。
我在SO上有很多答案,它们展示了在共享内存/映射文件中存储向量和各种更复杂数据结构的示例。您可能希望查找mapped_file_device
(来自Boost Iostreams)或managed_shared_memory
和managed_mapped_file
(来自Boost Interprocess)
答案 2 :(得分:0)
您需要在Windows 64位操作系统下分配此空间。您还必须设置&#34;大地址空间感知&#34;标志,否则由于虚拟内存系统在Windows上的工作方式,你只能获得2 GB的RAM。
你可能想要研究一下使用内存映射文件,正如他的回答中所建议的那样,如果你不一定要有一个10 GB的大块连续内存。如果你必须为Windows 32位构建你的应用程序,那么这将是唯一的答案,因为Windows 32位通常只允许2 GB的内存,除非该选项设置为&#34;大地址空间感知&#34;标志,此时它将允许3 GB的内存使用。
答案 3 :(得分:0)
当你必须处理大块内存时,你最好完全跳过malloc并直接进入操作系统调用内存分配。