[英]Memory problems with C
你好,祝你有美好的一天,經過幾天的反復試驗,我來到這里,所以如果我很傻,請原諒我。
我有以下代碼。 這段代碼的想法是首先讀取我擁有的所有文件並將所有數據存儲到矩陣Nsites
x Nx
x Ny
,然后將數據用於其他不相關的事情。
數據量不是很多,我的意思是我有數據的800個文件,這occupe不超過80MB,但無論如何,如果我嘗試使用一些DataFiles
高於134,我得到一個分段錯誤。
我認為這很奇怪,因為如果它適用於多個DataFiles=100
為什么它不應該適用於更高的?
我認為這是因為出於某種原因我的程序沒有為進程分配足夠的內存,或者因為我在分配內存時遇到了問題。 但我總是有相同數量的數據,我的數據文件正好有88*44
值,並且只工作到 134 個文件它是......我沒有“大量”數據/內存使用的經驗,但我認為1000*88*44
大約是10^6
個兩位數,並不算多。
我正在使用 GCC 編譯器和 Ubuntu(我認為是 14.02),當我嘗試使用 Codeblocks 在 Windows 中編譯和執行這個程序時,它只是崩潰(另一個謎)。
哦,我還打開了一個終端,使用 RAM 內存,並且有 134 個文件,這對計算機來說沒什么大不了的。
編輯:我也嘗試制作幾個[100][Nx][Ny]
數組並一個一個地使用它們,但這也會導致Segmentation Fault error 。 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 */
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.