Seite 1 von 1
IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 11:54
von Gimbly
Hallo zusammen,
habe mir einen kleinen Websever programmiert, der auf eine sehr große Datenmenge im Speicher zugreifen soll (mehrere GB) und zwar nur lesend.
Das Laden dieser Datenmenge dauert immer so seine Zeit, was gerade beim Entwickeln u. Testen sehr aufhält.
Meine Idee wäre es deshalb, diese Daten (mit einem separaten Programm) einmal in den Arbeitsspeicher zu laden und für den lesenden Zugriff des Webservers bereitzuhalten.
Habe zwar schon von IPC u. Shared Memory gehört, aber die Beispiele die ich gefunden habe waren sowas von mächtig, das ich nicht durchgestiegen bin.
Also deshalb mal ganz konkret gefragt: mit welchen Befehlen lade ich die Daten mit dem einen Prog. in den Speicher und mit welchen Befehlen kann ich diese dann im Webserver auslesen?
Das Ganze zunächst unter Windows, später dann auch gerne unter Linux.
Schonmal vielen Dank die Antworten
Re: IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 12:51
von Derren
Sorry keine Ahnung, aber mangels Wissen über diese Thematik würde ich mal folgendes Probieren.
Eine DLL erstellen, die deine ganzen Daten einliest und aber auch Methoden zum Bereitstellen der Daten zur Verfügung stellt.
Dann ein zweites Programm ("x"), welches einfach nur die DLL lädt. Solange Programm "x" läuft, sollte die DLL und alle Daten, die die DLL verwendet im Speicher bleiben.
Anschließend kannst du auch die DLL laden und solltest auf die Daten zugreifen können.
Vielleicht bin ich aber auch komplett auf dem Holzweg und nur die Bibliotheksfunktionen werden "geteilt" und die Daten gehören trotz allem noch zum aufrufenden Prozess

Re: IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 13:08
von Gimbly
Interesanter Ansatz, aber kann das 2. Prog. dann wirklich über die DLL auf die Daten des 1. Progs zugreifen?
Re: IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 13:21
von mk-soft
Leider hilft ihn das nicht, da zum testen die Daten beim laden der DLL auch wieder die Daten geladen werden müssen.
Tipp:
Da zu schon Übung mit mit den WebServer hast, schreib dir einen kleine Daten-Server auf ein anderen Port.
Wenn du unter 1460 Byte pro Block bleibst, hast zu auch keine Probleme mit den Handshake der Schnittstelle
Start des Daten-Server
- Alle Daten in den Speicher laden
- Server Port 6001 aufmachen
- Warten auf Anfrage
Beispiel der Netwerkdaten
Code: Alles auswählen
Structure udtAnfrage ; An Server
TransactionID.l
Command.l
Block.i
EndStructure
Structure udtAnwort ; Vom Server
TransactionID.l ; Echo
Command.l ; Echo
Block.i ; Echo
Daten.b[1024]
EndStructure
Re: IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 13:22
von mk-soft
Gimbly hat geschrieben:Interesanter Ansatz, aber kann das 2. Prog. dann wirklich über die DLL auf die Daten des 1. Progs zugreifen?
Nein
Dazu muss die DLL ganz speziell mit API Programmiert werden
Re: IPC u. Shared Memory für Anfänger
Verfasst: 14.02.2019 16:08
von NicTheQuick
Speicher die Daten unter Linux einfach in /dev/shm. Dann sind sie automatisch im RAM. Dann kannst du mit den Dateibefehlen darauf zugreifen und es geht blitzschnell. Oder du machst sowas hier:
https://en.m.wikipedia.org/wiki/Memory-mapped_file
Re: IPC u. Shared Memory für Anfänger
Verfasst: 15.02.2019 10:20
von Derren
@mk-soft: Würde das funktionieren, hätte er das Hilfsprogramm aber nur einmal starten müssen und so auch nur einmal die Daten einlesen müssen
Re: IPC u. Shared Memory für Anfänger
Verfasst: 15.02.2019 17:36
von Gimbly
@NicTheQuick: die Dateibefehle sind leider viel langsamer als PeekS(), wenn es darum geht 500.000 Stringsequenzen in ein Array zu laden. Gibt es eine Möglichkeit, ein Array so in eine Datei zu sichern, dass man es anschließend in einem Rutsch von der Datei ins Array laden kann, ohne For-Schleife 0 to 500000?
Re: IPC u. Shared Memory für Anfänger
Verfasst: 15.02.2019 18:10
von mk-soft
Den StringArray mit Trennzeichen NULL/NULL abspeichern. nach dem letzen eine Endekennung schreiben (#EOT$)
- Diesen dann mit ReadData komplett in den Speicher laden.
- Ein Array mit StringPointer anlegen. Global Dim *strVal.String(500000)
- Speicher durchsuchen und die Pointer von den String im Array ablegen
- Zugriff über *strVal(inne)\s
P.S.
Das Array so speichern das der Offset zum nächsten Element mit abgelegt wird.
Somit das das füllen des StringPointer array schneller...
Re: IPC u. Shared Memory für Anfänger
Verfasst: 19.02.2019 15:40
von Gimbly
Danke an Alle,
hab's jetzt so ähnlich wie mk-soft vorgeschlagen hat gemacht und in eine Datei geschrieben.
Das Laden der Datei geht ja ratzfatz, da sie im Cache gehalten wird.