![]() |
Delphi 64 Speicherfragen
Hallo zusammen,
derzeit entwickle ich ein Programm welches unter anderem Berechnungen mit großen Matrizen durchführen muss. Wenn ich groß sage, dann meine ich richtig groß. Im Endstadium werden die Teile bis ca. 400 GB groß. Derzeit lege ich kleiner Matrizen in den Speicher (TMemoryStream) und größere auf die Platte (TFileStream). Der Plattenzugriff ist natürlich trotz schneller SSDs wesentlich langsamer als der Speicherzugriff. Die Berechnungen mit den Matrizen laufen teilweise mehrere Tage... Mit Cache ist leider nicht, da ein nicht vorhersehbarer Zugriff auf die einzelnen Zellen stattfindet. Auch bringt mir natürlich bei intensiven Zugriffen das Multi-Threading nichts, da alles über einen zentralen Kanal laufen muss... Bei intensiven Berechnungen ist das was anderes... Nun zu den eigentlichen Fragen: 1. Wie viel Speicher kann ich mit Delphi 64 (XE5) max. verwenden? Leider bin ich unterwegs und habe meiner aktuellen Maschine nur etwa 2,5 GB frei und kann daher nicht testen. Im Internet findet man auch widersprüchliche Aussagen. Schön wäre natürlich, wenn ich den TMemoryStream im Hauptspeicher mit mehreren 100 GB laufen lassen könnte. Zur Not auch auf mehrere Streams aufgeteilt. Aktuelle Windows-Versionen unterstützen ja bereits in den Pro-Varianten bis 512GB Hauptspeicher. 2. Meint ihr es bringt was mehrere Lese-Streams zu öffnen um damit im Multi-Thread-Betrieb zu lesen? 3. Hat jemand eine Idee wie sich die SSDs im Stripe verhalten? Kann man da evtl. pushen? 4. Falls alle Stricke reisen wäre vielleicht das Erstellen der Rechenmodule (diese laufen als externe Anwendungen) mit anderen Software-Werkzeugen eine Lösung? Schön wäre natürlich eine positive Antwort zu Punkt 1. Schon mal vielen Danke für eure (hoffentlich positiven) Antworten. Alex |
AW: Delphi 64 Speicherfragen
Du hast einen Adressraum von 64^2 (OK, teilweise auch etwas weniger), aber Real hast du maximal RAM + Auslagerungsdatei.
PS: Das hat man auch schon mit 32 Bit. Es gibt da Adresswerweiterungen, aber praktisch kannst du das auch einfach mit MMFs (Memory Mapped Files) machen, was aber nicht unbedingt Dateien seien müssen, aber bei 400 GB brauchst du sowieso eine Erweiterung. MMFs kann man stückchenweise in den Speicher mappen und Windows sorgt da für das Cachen der Datei. Wenn du einen zusammenhängenden "Stream" hast, dann brauchst du auch bei 64 Bit immenoch einen "zusammenhängenden" Speicherbereich, innerhalb des Virtuellen Speichers der Anwendung. Vielleicht wäre es also eh besser, wenn du dir überlegst das in kleiner Stücke aufzuteilen. |
AW: Delphi 64 Speicherfragen
Da zapfe doch die NSA Server an. Die haben bestimmt noch ein wenig Kapazität frei, und die Laufzeiten sollten auch um einige schneller sein:lol:
|
AW: Delphi 64 Speicherfragen
Zitat:
Was genau meinst Du mit Memory Mapped Files? Geht das in Richtung RAM-Disk? Über sowas habe ich schon seit Jahren nicht mehr nachgedacht. Eleganter wäre natürlich der Memory-Stream... Wie gesagt: Es wäre kein Problem da eine Liste mit Streams zu erzeugen und dann halt den entsprechenden Stream zu berechnen den man gerade für den Zugriff benötigt. Hätte auch den Vorteil, dass man mit mehreren Threads gleichzeitig auf verschiedene Streams zugreifen kann... Man macht dann halt 2 GB Blöcke oder so. Bei 200 Stück sind das dan auch 400 GB... Die Frage ist halt nur ob Delphi da irgendwie motzt bzw. ober der Memeory-Manager von Delphi überhaupt in der Lage ist das zu verwalten... Vielen Dank nochmal Alex |
AW: Delphi 64 Speicherfragen
Der logische Adressraum eines 64bit Systems ist auch für 400GB groß genug. Die Auslagerungsdatei muss aber nicht so groß sein.
Ich schlage vor, dass du die Streams und die Delphi-Speicherverwaltung vergisst und es mit Memory Mapped Files implementierst. Wenn man nicht selbst ein ausgefeiltes Caching umsetzten will, ist es am Besten, sich auf die Mechanismen den Betriebssystem zu verlassen ... und MMFs sind für solche Problemen das Mittel der Wahl. |
AW: Delphi 64 Speicherfragen
Zitat:
Zum SSD-Striping: Hilft eigentlich nicht viel weiter. Problem ist doch die Zugriffszeit/Latenz. Die ist bei der SSD knapp 10^6 mal so lang wie beim RAM. DAS ist das Problem ;-) |
AW: Delphi 64 Speicherfragen
Hallo zusammen,
das mit den MMFs ist die Lösung. Habe gerade mal etwas gegoogelt. Scheint wie gemacht für diese Problem zu sein. Anstelle der Position im Stream rechne ich mir halt den Pointer aus... Brauche dann nur noch Funktionen zum Laden und speichern des MMFs auf Platte. VIELEN DANK :thumb: Alex |
AW: Delphi 64 Speicherfragen
Hi Leute,
weiß jemand wie ich die "offene Frage" schließen kann?? Alex |
AW: Delphi 64 Speicherfragen
Wenn du das, beim Erstellen, extra als offene Frage markiert hast, dann findest du beim "Antworten" (oder vielleicht auch beim Bearbeiten) wieder den Haken und kannst die Markierung wegmachen. (also meistens bei der "letzten" Antwort, wo man sich für alles bedankt :D)
MMF speichern brauchst du nicht, also wenn die eh schon direkt mit einer Datei verbunden war. |
AW: Delphi 64 Speicherfragen
Zitat:
Ich würde mal einen MRU (Most Recently Used) Cache ausprobieren. Der wächst bis zur maximalen Größe X und schmeisst dann die Elemente raus, die am längsten *nicht* benutzt werden, d.h. Du wirst schon einen Benefit haben, wenn einige Daten mehrfach angefordert werden. Von der Implementierung her ist es sehr sehr einfach: Man nehme eine Dictionary und eine linked List. Die Dictionary enthält die Listenelemente zum schnellen Suchen Wenn Du ein Element suchst, dann suchst Du in der Dictionary nach dem Listenelement und bringst das in der LL nach vorne. Wenn Du das Element nicht findest, lädst Du es und packst es in der LL nach vorne. Wenn die LL die Maximalgröße überschreitet, räumst Du von hinten her auf. Wäre denkbar, das das was bringt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz