Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Memory-Mapped-Files zur Speicherverwaltung (https://www.delphipraxis.net/214121-memory-mapped-files-zur-speicherverwaltung.html)

freimatz 21. Nov 2023 07:12


Memory-Mapped-Files zur Speicherverwaltung
 
Hallo,
ich bin hier an altem Code - aus der Zeit als noch Kilobytes teuer waren.

Da gibt es eine Klasse die Daten hält. Es geht um eine Menge von records die jeweils ca. 24 Doubles enthalten. Die Menge ist mal sehr klein z.B. 10, kann aber auch mal 100.000 sein.
Nun wird darin für kleine Mengen - konkrete bis 10 - eine TList<record> verwendet, für grössere Mengen ein Memory-Mapped-File. Das MMF hat keinen Dateinamen (ausser für Debugzwecke).
Die Windows-VCL-Anwendung wird seit einiger Zeit nur noch mit 64-Bit ausgeliefert.

Diese Klasse kann es dann auch wiederum 1000x geben.

Ich frage mich ob die Verwendung eines MMF noch Sinn macht. Lädt man nicht besser gleich alles in Speicher? Tut nicht Windows eh pagen wenn der Speicher knapp wird? (Wenn man aus der Menge ein Element benötigt, dann ist es sehr wahrscheinlich dass man alle braucht.)

Wenn ich nach MMF google, dann finde ich zumeist das als Mittel zur Interprozess-Kommunikation, nicht aber um grosse Speicher zu verwalten.

TiGü 21. Nov 2023 07:21

AW: Memory-Mapped-Files zur Speicherverwaltung
 
Probiere es halt aus?
Kommentiere den Code-Zweig aus, der das MMF anlegt und prüfe anhand eines passenden Unit-Test mit Zeitmessung, ob es gleich oder besser ist.

Wenn ich mich jetzt nicht verrechnet habe, dann ist das ja auch überschaubar für heutige Arbeitsspeicher:
24 * 8 Bytes (Double) * 100.000 = 19200000 Bytes => 18750 kB => 18,31 MB.

freimatz 21. Nov 2023 07:46

AW: Memory-Mapped-Files zur Speicherverwaltung
 
Na ja ausprobieren. Ja, ich habe schon probiert. Schon gefühlt ist es mit TList schneller als mit MMF.
Wichtiger ist es jedoch, dass es funktioniert. Und letztendlich weiss ich nicht was die Anwender alles so machen.

Wir haben keine maximalen Werte spezifiziert, die ich dann auch testen könnte.

Die ca. 20MB sind ja nicht wirklich viel. Wenn das jedoch 1000x verwendet wird sind wir bei ca. 20GB. Gehts das dann mit Windows? Paged dieses dann einfach? Oder muss man da (wie früher) irgendwo eine Pagefilegrösse einstellen? Was ich gerade gegoogelt habe wird die Auslagerungsdatei automatisch verwaltet, kann auch auch fest eingestellt werden.

Sinspin 21. Nov 2023 08:30

AW: Memory-Mapped-Files zur Speicherverwaltung
 
Wenn das ein echtes 64Bit Programm ist und die Datenverwaltung das auch weis/ausnutzt kannst Du die MMF raushauen. Mit dem virtuell verfügbaren Speicher braucht man sich da erstmal keinen Kopf machen.
Was zum Nachdenken ist eher die Frage ob es bei solchen Anwendungen Sinn macht die auf normalen Rechnern laufen zu lassen. Das sollten schon Maschienen sein die genug Ram stecken haben, denn Auslagern ist noch immer langsam und SSD gehen auch mal kaputt.

Neutral General 21. Nov 2023 08:56

AW: Memory-Mapped-Files zur Speicherverwaltung
 
Zitat:

Zitat von freimatz (Beitrag 1529886)
Wir haben keine maximalen Werte spezifiziert, die ich dann auch testen könnte.

Die ca. 20MB sind ja nicht wirklich viel. Wenn das jedoch 1000x verwendet wird sind wir bei ca. 20GB. Gehts das dann mit Windows? Paged dieses dann einfach? Oder muss man da (wie früher) irgendwo eine Pagefilegrösse einstellen? Was ich gerade gegoogelt habe wird die Auslagerungsdatei automatisch verwaltet, kann auch auch fest eingestellt werden.

Ich weiß ja nicht worum es da genau geht aber (10-100000) * (1-1000) ist halt ne ziemlich große Spanne.
Und da nur du aktuell weißt was diese Werte repräsentieren und wie dein Programm genutzt wird ist es vielleicht wichtig sich zu fragen was der durchschnittliche User macht.
Oder auch was realistische Zahlen sind, selbst wenn der User das Programm sehr ausreizt.

In der Theorie kann der User diese Datenstruktur 1000x mit jeweils 10000 Einträgen verwenden und wäre dann bei noch (gerade bei 64-Bit Anwendungen) ~1,8GB ohne Probleme dabei.
Kommt 1000x10000 realistisch/öfter vor? Also 1000 Klassen mit im Durchschnitt 10000 Records?
Rein aus dem Gefühl würde ich sagen dass das wahrscheinlich bereits Größenordnungen sind die User in der Praxis nicht oder selten erreichen werden.
Bei einer 64-Bit Anwendung und einem halbwegs modernen PC mit zumindest 16GB RAM kann man das ganze sogar nochmal vervierfachen und sollte immer noch keine ernsthaften Probleme bekommen.

Von daher sagt mir meine :glaskugel: dass du MMFs nicht brauchst.
Aber nur du kannst wissen wie User dein Programm benutzen und ob diese extremen/maximierten Zahlen die den Speicherbedarf auf 20GB aufpumpen überhaupt realistisch sind oder ob 1,8GB oder auch ~8GB (1000x40000 Records) nicht eine mehr als ausreichende, realistische Obergrenze darstellt

freimatz 23. Nov 2023 08:56

AW: Memory-Mapped-Files zur Speicherverwaltung
 
Danke Euch allen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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