AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Delphi 64 Speicherfragen

Ein Thema von BigAl · begonnen am 6. Feb 2014 · letzter Beitrag vom 20. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2   
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#1

Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 21:31
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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)

Geändert von BigAl ( 6. Feb 2014 um 21:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 21:55
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.638 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 21:57
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
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#4

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:07
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.
Vielen Dank für die schnelle Antwort. bei 64^2 meinst Du wahrscheinlich 2^64. Das mit dem RAM wäre kein Problem. Kommt halt die entsprechende Maschine her. Das Betriebssytem (z. B. Win 8 Pro) kann ja mit den Speichermengen umgehen...

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
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:14
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...
Eleganter wäre eigentlich schon die MMF. Dann sind vielleicht nicht mal die vollen 512GB nötig. (Kommt ein bisschen drauf an, wie "unvorhersehbar" die Zugriffe sind)

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
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#7

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:31
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

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#8

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:34
Hi Leute,

weiß jemand wie ich die "offene Frage" schließen kann??

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)

Geändert von BigAl ( 7. Feb 2014 um 00:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi 64 Speicherfragen

  Alt 6. Feb 2014, 22:54
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 )


MMF speichern brauchst du nicht, also wenn die eh schon direkt mit einer Datei verbunden war.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Delphi 64 Speicherfragen

  Alt 7. Feb 2014, 08:50
Mit Cache ist leider nicht, da ein nicht vorhersehbarer Zugriff auf die einzelnen Zellen stattfindet.
Das ist ja gerade der Sinn eines Caches, das selbst zu optimieren.

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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz