IPC u. Shared Memory für Anfänger

Anfängerfragen zum Programmieren mit PureBasic.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

IPC u. Shared Memory für Anfänger

Beitrag 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
Gruß
Markus
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: IPC u. Shared Memory für Anfänger

Beitrag 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 :oops:
Signatur und so
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: IPC u. Shared Memory für Anfänger

Beitrag von Gimbly »

Interesanter Ansatz, aber kann das 2. Prog. dann wirklich über die DLL auf die Daten des 1. Progs zugreifen?
Gruß
Markus
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: IPC u. Shared Memory für Anfänger

Beitrag 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
Zuletzt geändert von mk-soft am 14.02.2019 13:23, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: IPC u. Shared Memory für Anfänger

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: IPC u. Shared Memory für Anfänger

Beitrag 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
Bild
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: IPC u. Shared Memory für Anfänger

Beitrag 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
Signatur und so
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: IPC u. Shared Memory für Anfänger

Beitrag 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?
Gruß
Markus
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: IPC u. Shared Memory für Anfänger

Beitrag 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...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Re: IPC u. Shared Memory für Anfänger

Beitrag 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.
Gruß
Markus
Antworten