Können Sie sich einen sehr großen einzelnen Teil des Speichers (> 4 GB) in C oder C ++ zuordnen?

StackOverflow https://stackoverflow.com/questions/181050

  •  05-07-2019
  •  | 
  •  

Frage

Bei sehr großen Mengen an RAM in diesen Tagen Ich frage mich, ist es möglich, ein einzelnes Stück Speicher zuzuweisen, die größer als 4 GB ist? Oder brauche ich ein paar kleinere Stücke zu verteilen und zu handhaben das Umschalten zwischen ihnen?

Warum ??? Ich arbeite einige openstreetmap XML-Daten für die Verarbeitung und diese Dateien sind riesig. Ich bin Streaming sie zur Zeit in, da ich sie nicht alle in einen Chunk laden kann, aber ich nur neugierig auf die Obergrenzen für malloc oder eine neue bekam.

War es hilfreich?

Lösung

Kurze Antwort: Wahrscheinlich nicht

Damit dies funktioniert, Sie absolut würde Haben verwenden, um einen 64-Bit-Prozessor. Zweitens wäre es auf der Betriebssystem-Unterstützung ab, für mehr als 4G RAM zu einem einzigen Prozess zugeordnet werden.

In der Theorie wäre es möglich sein, aber Sie würden in der Dokumentation des Speicherzuordner lesen müssen. Sie würden auch anfälliger für Speicherfragmentierungsprobleme sein.

Es gibt gute Informationen über Windows-Speicherverwaltung .

Andere Tipps

A Primer auf physcal und virtuellem Speicher-Layout

Sie müßten ein 64-Bit-CPU und O / S bauen und mit ziemlicher Sicherheit genug Speicher, um Ihren Arbeitssatz zu vermeiden Dreschen. Ein wenig Hintergrund:

Ein 32-Bit-Maschine (im Großen und Ganzen) besitzt Register, die eines von 2 ^ 32 (4,294,967,296) eindeutige Werte speichern kann. Dies bedeutet, dass ein 32-Bit-Zeiger irgendeine von 2 ^ 32 einzigartigen Speicherstellen adressieren, die ist, wo die Magie 4GB Grenze kommt.

Einige 32-Bit-Systemen wie dem sparcv8 oder Xeon haben MMU, die einen Trick ziehen mehr physischen Speicher zu ermöglichen. Auf diese Weise kann mehr Prozesse Speicher nehmen mehr als 4 GB in Aggregate insgesamt, aber jeder Prozess ist auf seinen eigenen 32-Bit virtuellen Adressraum begrenzt. Für einen einzelnen Vorgang an einem virtuellen Adressraum sucht, nur 2 ^ 32 verschiedene physische Standorte können durch einen 32-Bit-Zeiger zugeordnet werden.

Ich werde nicht in die Details gehen, aber diese Präsentation (Warnung: Powerpoint) beschreibt, wie das funktioniert. Einige Betriebssysteme verfügen über Einrichtungen (wie solche, die hier - dank FP oben), um die MMU und tauschen verschiedene physische Standorte in den virtuellen Adressraum unter Benutzerebene Steuerung zu manipulieren

.

Das Betriebssystem und Speicher abgebildeten E / A-Teil des virtuellen Adressraumes einnehmen wird, so dass nicht alle diese 4GB ist unbedingt auf den Prozess zur Verfügung. Als ein Beispiel, 2 GB dieser Vorgaben Windows nehmen, können aber eingestellt werden, nur 1 GB nehmen, wenn der / 3G-Schalter beim Booten aufgerufen wird. Dies bedeutet, dass ein einzelner Prozess auf einer 32-Bit-Architektur dieser Art nur eine zusammenhängende Datenstruktur von etwas weniger als 4 GB im Speicher aufbauen kann.

Dies bedeutet, dass Sie explizit den PAE verwenden müßten Einrichtungen unter Windows oder Equivalent Einrichtungen auf Linux manuell in den Overlays zu tauschen. Dies ist nicht unbedingt so schwer, aber es wird einige Zeit dauern, zum Laufen zu bringen.

Alternativ können Sie eine 64-Bit-Box mit viel Speicher erhalten und diese Probleme mehr oder weniger verschwinden. Eine 64-Bit-Architektur mit 64-Bit-Zeigern kann mit nicht weniger als 2 ^ 64 (18,446,744,073,709,551,616) eindeutigen Adressen, zumindest in der Theorie eine zusammenhängende Datenstruktur aufzubauen. Dies ermöglicht größere zusammenhängende Datenstrukturen aufgebaut und verwaltet werden.

Der Vorteil von Speicherdateien zugeordnet ist, dass Sie eine Datei viel größer als 4 GB öffnen können (fast unendlich auf NTFS!) Und haben mehrere <4 GB Speicherfenster hinein.
Es ist viel mehr efficent als eine Datei zu öffnen und es in den Speicher, auf den meisten Betriebssystemen lesen nutzt die eingebauten in Paging-Unterstützung.

Dies sollte kein Problem mit einem 64-Bit-Betriebssystem (und eine Maschine, die so viel Speicher hat).

Wenn malloc nicht bewältigen kann dann das Betriebssystem wird sicherlich APIs bieten, mit denen Sie Speicher direkt zuzuordnen. Unter Windows können Sie die VirtualAlloc API.

es hängt davon ab, welche C-Compiler Sie verwenden, und auf welcher Plattform (natürlich), aber es gibt keinen fundamentalen Grund, warum Sie nicht die größten Brocken aufeinander folgend verfügbaren Speicher zuweisen können - was weniger sein kann, als Sie benötigen. Und natürlich können Sie ein 64-Bit-System zu verwenden als viel RAM zu adressieren ...

finden Sie unter Malloc für Geschichte und Details

HeapMax in alloc.h die größte verfügbare Blockgröße zu erhalten

Haben Sie darüber nachgedacht, Speicherdateien abgebildet mit? Da Sie in wirklich großen Dateien laden, so scheint es, dass dies der beste Weg zu gehen.

Es hängt davon ab, ob die OS Sie virtuellen Adressraum geben wird, die Speicher über 4 GB Adressierung erlaubt und ob der Compiler unterstützt neue / malloc zugewiesen werden.

Für 32-Bit-Windows werden Sie nicht in der Lage sein, einzelne Klumpen größer als 4 GB zu bekommen, da die Zeigergröße 32-Bit ist, so dass Sie Ihren virtuellen Adressraum auf 4 GB begrenzt. (Könnte Sie verwenden Physical Address Extension mehr zu bekommen als Speicher 4GB, aber ich glaube, Sie, dass der Speicher in den virtualaddress Raum von 4 GB zur Karte hast sich selbst)

Für 64-Bit-Windows, die VC ++ Compiler unterstützt 64-Bit-Zeiger mit theoretischer Grenze des virtuellen Adressraumes zu 8 TB.

Ich vermute, dass das gleiche für Linux / gcc gilt - 32-Bit ist nicht zulassen, dass, während 64-Bit Sie erlaubt

.

Als Rob wies darauf hin, VirtualAlloc für Windows ist eine gute Option für diese, als eine anonymouse Dateizuordnung ist. Doch speziell in Bezug auf Ihre Frage, die Antwort auf „wenn C oder C ++“ zuordnen kann, ist die Antwort Nein Diese unterstützt wird auch nicht auf Win7 RC 64

In der PE / COFF Spezifikation für exe-Dateien, die das Feld der HEAP Reserve und HEAP zu begehen gibt, ist eine 32-Bit-Größe. Dies ist im Einklang mit den physikalischen Größenbeschränkungen der aktuellen Heap implmentation in dem Windows-CRT, die nur kurz von 4 GB ist. So gibt es keine Möglichkeit mehr zu vergeben als 4 GB von C / C ++ (technicall die OS-Support-Einrichtungen von Create und VirtualAlloc / VirtualAllocNuma etc ... ist nicht C oder C ++).

Auch BE AWARE , dass es zugrunde liegend x86 oder amd64 ABI Konstrukt bekannt als Seitentisch ist. Diese WILL in der Tat tun, was Sie sind concerened über, kleinere Stücke Zuteilung für Ihre größeren Wunsch, auch wenn dies im Kernel-Speicher happining, gibt es einen Effekt auf das Gesamtsystem sind diese Tabellen endlich.

Wenn Sie Speicher in einer solchen grandious purportions sind Zuteilung, würden Sie gut beraten, über die Zuweisung Granularität zuzuteilen basiert (die VirtualAlloc erzwingt) sowie optionalen Flags oder des Methoden zu identifizieren, um größere Seiten zu ermöglichen.

4kb Seiten waren die anfängliche Seitengröße für die 386, subsaquently die pentium 4MB hinzugefügt. Heute ist die AMD64 (Software-Optimierungs-Leitfaden für AMD Familie 10h Processors) eine maximale Seitentabelleneintrag Größe von 1 GB. Dieser Mittelwert ist für Ihren Fall hier, sagen wir, Sie 4GB nur täte, würde es nur vier eindeutige Einträge im Verzeichnis der Kernel benötigen, um Ihren Prozess Speicher zu lokalisieren \ zuweisen und die Erlaubnis.

Microsoft hat auch diese

Wenn size_t von mehr als 32 Bits auf dem System ist, haben Sie die erste Hürde genommen. Aber die C und C ++ Standards sind nicht verantwortlich für die Bestimmung, ob eine bestimmte Aufruf an neue oder malloc erfolgreich ist (außer malloc mit einer Größe 0). Das hängt ganz von dem O und dem aktuellen Zustand des Haufens.

Wie alle anderen gesagt, eine 64-Bit-Maschine immer ist der Weg zu gehen. Aber auch auf einer 32-Bit-Maschine Intel-Maschine, können Sie Adresse größer als 4 GB Speicherbereiche, wenn Ihr Betriebssystem und Ihre CPU-Unterstützung PAE . Leider hat 32bit WinXP dies nicht tun (nicht 32bit Vista?). Linux können Sie dies standardmäßig tun, aber Sie werden auf 4gb Bereiche beschränkt werden, auch mit mmap (), da Zeiger noch 32bit sind.

Was Sie aber tun sollten, ist das Betriebssystem kümmern sich um die Speicherverwaltung für Sie lassen. Holen Sie sich in einer Umgebung, die so viel RAM umgehen kann, dann lesen Sie die XML-Datei (en) in (a) Datenstruktur (en), und lassen Sie es den Raum für Sie reservieren. Dann arbeitet auf der Datenstruktur im Speicher, statt sich auf der XML-Datei arbeiten.

Auch in 64-Bit-Systeme aber sind Sie nicht viel Kontrolle über welche Teile des Programms tatsächlich im RAM sitzen, in Cache oder sind ausgelagert auf der Festplatte, zumindest in den meisten Fällen, da das Betriebssystem haben, zu gehen und die MMU diese selbst behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top