【C/C++】malloc 最大能申请的一维数组空间是4G?

问题描述

现在有128个二进制文件要读取到内存,每个文件大小都是269.4MB。每个文件有2^15条数据,每条数据大小为2*N*sizeof(uint32_t) = 2*1024*4 = 8192字节。我的想法是,定义一个一维指针数组database,所有文件的数据都存到database

@Override
 //每个文件有2^15条数据,每条数据大小为2*N*sizeof(uint32_t)=2*1024*4=8192字节
	int flen = 1 << 15;
	uint32_t *database=(uint32_t*)malloc(128 * flen * 2 * N * sizeof(uint32_t));
	//循环调用读取文件的函数,该函数每次只读取一个文件
	for(int i = 0; i < 128; i++){
		ReadDatabase(flen, database + i * flen * 2 * N);
	}

因为我当时是采用MPI多进程跑的程序,4台机器都要在各自的磁盘上读取128个二进制文件(这些文件是不同的),结果编译的时候没出现问题,运行的时候会报出:

BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES EXIT CODE: 139

当时经过我的测试,给database分配16个二进制文件的空间,即:
16 ∗ f l e n ∗ 2 ∗ N ∗ s i z e o f ( u i n t 32 _ t ) = 16 ∗ 2 15 ∗ 2 ∗ 1024 ∗ 4 = 4 G 16*flen*2*N*sizeof(uint32\_t)=16*2^{15}*2*1024*4=4G 16flen2Nsizeof(uint32_t)=16215210244=4G
程序就能正常运行,所以我就以为malloc一次最多能分配的空间为4G。

原因分析:

后面经过大佬的帮忙,我才知道我在分配database空间的时候,没有把真正想要分配的空间的大小分配到database,我当时很疑惑就做了测试,输出malloc的size大小,果然震惊到我了,输出来的是负数!!

原来malloc(128 * flen * 2 * N * sizeof(uint32_t))的时候,里面的表达式结果超出了默认的int32_t所能表示的范围,因此要改成int64_t


解决方案:

@Override
 //每个文件有2^15条数据,每条数据大小为2*N*sizeof(uint32_t)=2*1024*4=8192字节
	int flen = 1 << 15;
	int64_t arr_size = 2 * N * sizeof(uint32_t);
	arr_size *= 128 * flen;
	uint32_t *database=(uint32_t*)malloc(arr_size);
	//循环调用读取文件的函数,该函数每次只读取一个文件
	for(int64_t i = 0; i < 128; i++){
		ReadDatabase(flen, database + i * flen * 2 * N);
	}

注意循环读取文件的时候,循环变量i也要改成int64_t,否则访问不到想要的内存

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值