【发布时间】:2016-09-15 01:46:23
【问题描述】:
您好,祝您有美好的一天,经过几天的反复试验,我来到这里,如果我很傻,请原谅我。
我有以下代码。这段代码的想法是首先读取我拥有的所有文件并将所有数据存储到矩阵NsitesxNxxNy,然后将这些数据用于其他不相关的事情。
数据量不是很多,我的意思是我有 800 个数据文件,占用不超过 80MB 但无论如何,如果我尝试使用大于 134 的 DataFiles 的数字,我会得到一个 分段错误错误。
我认为这很奇怪,因为如果它适用于多个 DataFiles=100,为什么它不应该适用于更高的值?
我认为这是因为某种原因我的程序没有为进程分配足够的内存,或者是因为我在分配内存时遇到了问题。但是我总是拥有相同数量的数据,并且我的数据文件具有完全相同的 88*44 值,并且只能工作到 134 个文件......我没有“大量”数据/内存使用的经验,但我认为 @ 987654327@ 大约是10^6 两位数,不算太多。
我正在使用 GCC 编译器和 Ubuntu(我认为是 14.02),当我尝试使用 Codeblocks 在 Windows 中编译和执行这个程序时,它只会崩溃(另一个谜团)。
哦,我还打开了一个终端,使用 RAM 内存,并且有 134 个文件,这对计算机来说没什么大不了的。
编辑:我也尝试制作几个 [100][Nx][Ny] 数组并一个一个地使用它们,但这也会导致 Segmentation Fault 错误。
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
}
【问题讨论】:
-
你的两个数组
fun和Res总共是 6195200 字节。在 Linux 上,默认堆栈为 8MB。你把它剪得非常接近。 -
你应该在读完之后关闭文件。
-
你不检查
fopen是否成功! -
您是否需要同时获取内存中所有文件的数据?仅来自单个文件或几个文件的数据就足够了吗?
-
关于 StackOverflow 的 StackOverflow 问题。循环:见迭代。迭代:见循环。
标签: c memory codeblocks