2016-09-13 2 views
1

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 
} 
+4

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. –

+0

Sie sollten die Dateien wahrscheinlich nach dem Lesen schließen. – tkausl

+0

Sie überprüfen nicht, ob 'fopen' erfolgreich ist! –

Antwort

1

Sie haben keinen Stapel mehr. In der Regel nicht mehr als 8k auf einmal auf dem Stapel zuweisen. Hoppla.

ändern

double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny]; 

Um

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 */ 
} 
+0

Wenn ich diesen Code mit reinem copy-paste versuche, kompiliert es nicht, sagt 'Fehler: Variable-Größe Objekt kann nicht initialisiert werden'. Ich werde genauer hinsehen, aber ich verstehe malloc noch nicht gut genug. Auch ich verstehe nicht, warum ich es nicht tun kann, aber ich bin erleichtert, vielen Dank, aufrichtig. – fdzglln

+0

Ich kann immer noch nicht finden, wie das funktioniert, kann ich keine Matrix mit 'malloc' deklarieren? – fdzglln

+0

@fdzglln: Ich musste es selbst suchen.Es stellt sich heraus, dass der Typ Klammern benötigt, um zu funktionieren. – Joshua

Verwandte Themen