2015-05-12 17 views
7

Ich bin neu in C++, und ich studiere "Compressive Sensing", also muss ich mit riesigen Matrizen arbeiten, und MATLAB ist eigentlich langsam, also habe ich meinen Algorithmus mit C++ programmiert.Bad Alloc mit einem 200GB Speicher verfügbar C++

Die Sache ist, dass ich große Arrays (etwa 100 MB-1 GB) speichern. Sie sind 20 Arrays ca. und es funktioniert gut mit 30 GB Speicher aber wenn der Prozess mehr als 40 GB benötigt, stoppt es einfach. Ich denke, es ist ein Speicherproblem, ich testete es auf Linux und Windows (64-Bit-Betriebssystem - Compiler 64 Bit MinGW - 200 GB Ram - Intel Xeon) gibt es irgendwelche Einschränkungen ?.

size_t tm=n*m*l; 
double *x=new double[tm]; 

Ich verwende etwa 20 Arrays wie dieses. n, m ~ = 1000 und L ~ = 30 sind dies typischerweise Größen.

Danke

+10

Sie haben möglicherweise 200 GB Gesamtspeicher, aber Sie benötigen 40 GB * zusammenhängenden * Speicher? Ich bin nicht überrascht, dass Sie das nicht tun können. Unterteilen Sie Ihre Zuweisung in mehrere Teile. –

+0

20 * 1k * 1k * 30 = ??? – user3528438

+0

* "Wenn der Prozess mehr als 40 GB benötigt, stoppt er einfach" * - Sie erhalten also eine 'std :: bad_alloc' Ausnahme? Sie könnten versuchen, die größten Zuweisungen so früh wie möglich zu machen - das könnte die Fragmentierung reduzieren. Beruhen Ihre Speicherverbrauchsmessungen auf den Anforderungen im Quellcode oder in einem Dienstprogramm wie Top oder Task Manager? Weil das Suchen in einem Dienstprogramm Einblick geben kann, ob es ein Speicherleck gibt .... –

Antwort

3

20-Arrays, ein Problem mit 40 GB Speichernutzung in total - das, dass die Programmunterbrechungen schon sagt, wenn ein Array 2 GB übersteigt. Dies sollte nicht passieren, ein 64-Bit-Adressraum sollte eine 64-Bit-size_t für Objektgrößen verwenden. Es scheint, dass MinGW eine 31-Bit-Größe falsch verwendet (d. H. Auch ein Vorzeichen-Bit verliert).

Ich weiß nicht, wie Sie Speicher reservieren, aber das ist vielleicht reparierbar, indem Sie die gebrochene Zuteilungsroutine umgehen und direkt zum OS-Zuordner gehen. Z.B. für Windows können Sie VirtualAlloc aufrufen (überspringen Sie HeapAlloc, es ist nicht für so große Zuweisungen ausgelegt).