C 的内存问题
Memory problems with C
你好,祝你有美好的一天,经过几天的反复试验,我来到了这里,如果我很傻,请原谅我。
我有以下代码。这段代码的想法是首先读取我拥有的所有文件并将所有数据存储到矩阵 Nsites
xNx
xNy
中,然后将数据用于其他不相关的事情。
数据量不是很多,我的意思是我有 800 个数据文件,占用不超过 80MB,但无论如何,如果我尝试使用高于 134 的 DataFiles
数字,我会得到 分段错误。
我认为这很奇怪,因为如果它适用于多个 DataFiles=100
为什么它不应该适用于更高的?
我认为这是因为出于某种原因我的程序没有为进程分配足够的内存,或者因为我在分配内存时遇到问题。但是我总是拥有相同数量的数据,并且我的数据文件具有完全 88*44
的值并且只能工作到 134 个文件......我没有使用 "high amount" 的 data/memory 的经验但我认为 1000*88*44
大约 10^6
两位数并不过分。
我正在使用 GCC 编译器和 Ubuntu(我认为是 14.02),当我尝试在 Windows 中使用 Codeblocks 编译和执行这个程序时它就崩溃了(另一个谜团)。
哦,我还打开了一个终端,使用 RAM 内存,有 134 个文件,这对计算机来说没什么大不了的。
编辑:我还尝试制作几个 [100][Nx][Ny]
数组并一个一个地使用它们,但这也会导致 分段错误错误 。
EDIT2:小错误文本和代码
另外,我采用这种方式是因为我同时需要所有这些数据...我正在考虑避免这种情况的新方法,但最近几天没有找到任何替代方法。
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int Nx=88; //
const int Ny=44; //
const int DataFiles=100; // How many data files are we going to read
int main() {
int i, j, ki , kj ,index;
double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];
FILE * conf;
char file[100];
for (index=0; index<DataFiles; index++){
sprintf(file,"data//file%i00.txt",5000+index*25);
conf=fopen(file,"r");
for(ki=0;ki<Nx;ki++){
for(kj=0;kj<Ny;kj++){
fscanf(conf,"%i %i %lf", &i, &j, &fun[index][ki][kj]);
mean[ki][kj] = mean[ki][kj] + fun[index][ki][kj] ;
}}
fclose (conf);
}
// do things with my loaded data
}
你 运行 出栈了。一般来说,不要一次在栈上分配超过8k。哎呀
改变
double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];
至
double (*fun)[Nx][Ny] = malloc(sizeof(fun[0]) * DataFiles), (*Res)[Nx][Ny] = malloc(sizeof(Res[0]) * DataFiles), mean[Nx][Ny];
if (!fun || !Res) {
/* handle OOM */
}
你好,祝你有美好的一天,经过几天的反复试验,我来到了这里,如果我很傻,请原谅我。
我有以下代码。这段代码的想法是首先读取我拥有的所有文件并将所有数据存储到矩阵 Nsites
xNx
xNy
中,然后将数据用于其他不相关的事情。
数据量不是很多,我的意思是我有 800 个数据文件,占用不超过 80MB,但无论如何,如果我尝试使用高于 134 的 DataFiles
数字,我会得到 分段错误。
我认为这很奇怪,因为如果它适用于多个 DataFiles=100
为什么它不应该适用于更高的?
我认为这是因为出于某种原因我的程序没有为进程分配足够的内存,或者因为我在分配内存时遇到问题。但是我总是拥有相同数量的数据,并且我的数据文件具有完全 88*44
的值并且只能工作到 134 个文件......我没有使用 "high amount" 的 data/memory 的经验但我认为 1000*88*44
大约 10^6
两位数并不过分。
我正在使用 GCC 编译器和 Ubuntu(我认为是 14.02),当我尝试在 Windows 中使用 Codeblocks 编译和执行这个程序时它就崩溃了(另一个谜团)。
哦,我还打开了一个终端,使用 RAM 内存,有 134 个文件,这对计算机来说没什么大不了的。
编辑:我还尝试制作几个 [100][Nx][Ny]
数组并一个一个地使用它们,但这也会导致 分段错误错误 。
EDIT2:小错误文本和代码
另外,我采用这种方式是因为我同时需要所有这些数据...我正在考虑避免这种情况的新方法,但最近几天没有找到任何替代方法。
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int Nx=88; //
const int Ny=44; //
const int DataFiles=100; // How many data files are we going to read
int main() {
int i, j, ki , kj ,index;
double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];
FILE * conf;
char file[100];
for (index=0; index<DataFiles; index++){
sprintf(file,"data//file%i00.txt",5000+index*25);
conf=fopen(file,"r");
for(ki=0;ki<Nx;ki++){
for(kj=0;kj<Ny;kj++){
fscanf(conf,"%i %i %lf", &i, &j, &fun[index][ki][kj]);
mean[ki][kj] = mean[ki][kj] + fun[index][ki][kj] ;
}}
fclose (conf);
}
// do things with my loaded data
}
你 运行 出栈了。一般来说,不要一次在栈上分配超过8k。哎呀
改变
double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];
至
double (*fun)[Nx][Ny] = malloc(sizeof(fun[0]) * DataFiles), (*Res)[Nx][Ny] = malloc(sizeof(Res[0]) * DataFiles), mean[Nx][Ny];
if (!fun || !Res) {
/* handle OOM */
}