【问题标题】:Memory problems with CC 的内存问题
【发布时间】: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
}

【问题讨论】:

  • 你的两个数组 funRes 总共是 6195200 字节。在 Linux 上,默认堆栈为 8MB。你把它剪得非常接近。
  • 你应该在读完之后关闭文件。
  • 你不检查fopen是否成功!
  • 您是否需要同时获取内存中所有文件的数据?仅来自单个文件或几个文件的数据就足够了吗?
  • 关于 StackOverflow 的 StackOverflow 问题。循环:见迭代。迭代:见循环。

标签: c memory codeblocks


【解决方案1】:

你的堆栈用完了。一般来说,不要在堆栈上一次分配超过 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 */
}

【讨论】:

  • 如果我用纯复制粘贴尝试这段代码,它不会编译它说error:variable-sized object may not be initialized。我会仔细研究它,但我仍然不太了解 malloc 。我也不明白为什么我做不到,但我松了一口气,非常感谢,真诚的。
  • 我仍然找不到如何进行这项工作,我无法使用malloc 声明矩阵?
  • @fdzglln:我必须自己查一下。事实证明,类型需要括号才能工作。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多