Wie man großen Speicher, wie 10 G, dynamisch unter Verwendung eines neuen Operators in C ++ auf 64-Linux zuweist?

9

Ich muss ein größeres Float-Array für eine spezielle Anwendung mit C ++ - neuem Operator wie 10G dynamisch zuweisen. Der Code läuft auf 64-ubuntu-14.04 Linux OS mit 64G Speicher. Wenn ich die Anforderung von Speicher als etwa 7G, 1879048192x4/(1024x1024x1024)=7G (float hat 4 Bytes), wie folgt festlegen:

%Vor%

Das Programm funktioniert gut, aber wenn ich versuche, die Anfrage auf 10G zu erhöhen, habe ich ein what(): std::bad_alloc . Ich versuche auch malloc() als neuen Operator zu verwenden:

%Vor%

Erhalte aber das gleiche Ergebnis. Mein ulimit -a ist das:

%Vor%

Jemand könnte sagen, dass es keinen 10G kontinuierlichen Speicher für die Zuweisung gibt, aber ich schließe alle anderen Fortschritte und der Gesamtspeicher ist 64G. Ich möchte wissen, ob ich dieses größere Array erhalten kann oder nicht und wie. Beschränkt das Linux die maximale Anzahl für diese dynamische Zuweisung? Wo und wie?

    
changingivan 11.05.2015, 15:19
quelle

1 Antwort

2

Ich sehe kein Problem, wenn ich es versuche. Sowohl new als auch malloc haben gearbeitet. Mein System läuft Ubuntu 15.04 und hat 16G RAM.

Wenn ich jedoch versuche, den Speicher zu verwenden, musste ich sehr vorsichtig mit den Typen von Vars umgehen, die zum Indexieren in das Datenarray verwendet werden.

Zum Beispiel kann das folgende Programm mit nur long int und float unerwünschte Dinge tun, weil ein long int einen maximalen Wert von 2^31 hat und die Array-Länge für 10Gi länger ist als 2^31 . Floats fügen auch 1.0 gleichzeitig zu 16777216.0 hinzu. Bei doubles ist es in Ordnung, hier lange int-Indizes zu verwenden, da das Array kürzer ist.

use10G.c ++

%Vor%     
Paul 11.05.2015, 22:29
quelle

Tags und Links