赞
踩
现在有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
16∗flen∗2∗N∗sizeof(uint32_t)=16∗215∗2∗1024∗4=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
,否则访问不到想要的内存
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。