Hallo und habe einen guten Tag, ich bin hier nach Tagen der Versuch und Irrtum gekommen, also vergib mir, wenn ich beign albern bin.Speicherprobleme mit C
Ich habe den folgenden Code. Die Idee dieses Codes ist zunächst alle Dateien zu lesen, die ich habe und alle Daten in einer Matrix Nsites
x Nx
x Ny
zu speichern und dann die Daten für andere nicht verwandte Dinge zu verwenden.
Die Menge der Daten nicht sehr viel, das ich meine, ich habe 800 Dateien von Daten, die nicht mehr als 80 MB occupé aber trotzdem, wenn ich versuche, eine Zahl zu verwenden DataFiles
höher als 134 Ich erhalte einen Segmentation Fault Fehler.
Ich denke, es ist seltsam, wenn es mit einer Reihe von DataFiles=100
funktioniert, warum sollte es nicht für höhere arbeiten?
Ich dachte, es war, weil mein Programm aus irgendeinem Grund nicht genügend Speicher für den Prozess zugewiesen bekommt oder weil ich ein Problem bei der Zuweisung des Speichers habe. Aber ich habe immer die gleiche Menge an Daten und meine Dateien haben genau 88*44
Werte und funktioniert nur bis 134 Dateien ist es ... Ich habe keine Erfahrung mit "hoher Menge" an Daten/Speicherverbrauch, aber ich denke, dass 1000*88*44
das ist etwa 10^6
zweistellig ist es nicht zu viel.
Ich benutze GCC-Compiler und Ubuntu (14.02 denke ich), wenn ich versuche, dieses Programm in Windows zu kompilieren und auszuführen mit Codeblocks stürzt es einfach ab (ein anderes Geheimnis).
Oh, ich hatte auch ein Terminal mit RAM-Speicher-Nutzung geöffnet und mit 134 Dateien war es nichts großes zu handhaben für den Computer.
EDIT: Ich habe auch versucht, mehrere [100][Nx][Ny]
Arrays zu machen und sie nacheinander zu verwenden, die aber auch zum Segmentierungsfehlerfehler führen. EDIT2: kleinere Erratas Text und Code Auch ich folge diesem Weg, weil ich alle diese Daten gleichzeitig brauche ... Ich denke an neue Möglichkeiten, dies zu vermeiden, aber die letzten paar Tage haben keine Alternative gefunden.
#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
}
Ihre beiden Arrays 'fun' und' Res' sind 6.195.200 Bytes insgesamt. Unter Linux ist der Standard-Stack 8 MB. Du machst es furchtbar nah. –
Sie sollten die Dateien wahrscheinlich nach dem Lesen schließen. – tkausl
Sie überprüfen nicht, ob 'fopen' erfolgreich ist! –