你好,祝你今天愉快,经过几天的尝试和错误,我来到这里,所以如果我装傻了,请原谅我。
我有下面的代码。这段代码的思想首先是读取我拥有的所有文件,并将所有数据存储到一个矩阵NsitesxNxxNy中,然后将数据用于其他无关的事情。
数据量不是很大,我的意思是,我有800个数据文件发生的不超过80 to,但无论如何,如果我试图使用一个数字高于134号,我会得到一个分割错误错误。
我认为这很奇怪,因为如果它与许多DataFiles=100一起工作,为什么它不应该在更高的地方工作?
我认为这是因为我的程序没有为进程分配足够的内存,或者是因为我在分配内存时遇到了问题。但是我总是有相同数量的数据,我的数据文件有精确的88*44值,并且只工作到134个文件--它是.我没有使用“大量”数据/内存的经验,但我认为1000*88*44 --也就是10^6的两位数--并不是太多。
我使用GCC编译器和Ubuntu (我认为是14.02),当我试图用代码锁在Windows中编译和执行这个程序时,它只是崩溃(另一个错误)。
哦,我还有一个终端打开,内存使用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
}发布于 2016-09-13 17:40:44
你的堆用完了。一般来说,不要在堆栈上一次分配超过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 */
}https://stackoverflow.com/questions/39475879
复制相似问题