当前位置:   article > 正文

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

malloc最大能申请多大的空间

问题描述

现在有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);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

因为我当时是采用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);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/333315
推荐阅读
相关标签
  

闽ICP备14008679号