Laden...

Statische Daten für mehrere unabhängige Anwendungen

Erstellt von mosspower vor 12 Jahren Letzter Beitrag vor 12 Jahren 762 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 12 Jahren
Statische Daten für mehrere unabhängige Anwendungen

Hallo,

ich zermartere mir gerade den Kopf, wie ich folgendes Problem lösen könnte.
Ich habe auf einem Rechner x-verschiedene (können auch mal > 20 sein) Programme laufen. Diese brauchen keinen Austausch mit Datenbanken. Datengrundlage (Lookup) sind XML-Dateien mit ID- und Kataloginformationen. Diese werden vom Serverprogramm beim Deployment aus der Hauptdatenbank generiert und deployed.
Aufgräge kommen via MSQM rein und raus.

Wie, wenn es überhaupt möglich ist, kann ich vorgehen, um die XML-Dateien lediglich einmal pro Rechner zu laden und nicht pro Applikation?
Klar ist schon, dass ich die jeweiligen Inhalte cache (static), aber ich würde die gerne für alle Applikationen einmal cachen. Wie geht man da vor, ohne alle Anwendungen in eine zu packen?

Oder kann es sein, dass ich hier ein Verständnisproblem habe und das vom System schon "richtig" interpretiert wird. Also, wenn 20 Applikationen auf die gleiche DLL zugreifen, dann sind doch 20 Instanzen im Speicher oder eine?

Danke für etwaige Antworten schon einmal im Voraus.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo mosspower,

wenn 20 Anwendungen die gleiche DLL brauchen, dann sollte es eigentlich so laufen, dass die DLL (der IL- bzw. Maschinen-Code) nur einmal geladen wird. Allerdings hat jede DLL ihr eigenes Datensegment. Die Daten wären also, selbst wenn sie gleich sind, 20 mal vorhanden.

Wenn sich die Anwendungen den Speicher teilen sollen, könntest du Shared Memory verwenden. Shared Memory unter Windows ist allerdings filebased, das heißt du greifst darauf zu wie auf eine Datei. Was du ausliest ist das wieder als Kopie im Speicher der jeweiligen Anwendung. Insofern ist es also vielleicht einfacher, wenn du in der Anwendung immer nur die Daten direkt aus der Datei liest, die du gerade brauchst.

herbivore

PS: Die Angaben sind unter Vorbehalt, weil es lange her ist, dass ich mit Shared Mem unter Windows gearbeitet habe (war noch zu NT Zeiten).

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo mosspower,

wenn 20 Applikationen auf die gleiche DLL zugreifen, dann sind doch 20 Instanzen im Speicher oder eine?

Da gibt es verschiedene Fälle. Bei nativen DLLs und bei NGen-DLLs trifft die obige Aussage von herbivore zu. Wenn jedoch keinen NGente managed DLLs vorliegt, so wird diese in den jeweiligen Prozess geladen und dort geJITet, d.h. du hast dann bei 20 (managed) Applikationen auch 20x dieselbe DLL geladen. Siehe hierzu auch CLR Inside Out: The Performance Benefits of NGen. In allen Fällen wird jedoch nur das Code-Segment geteilt, das Daten-Segment ist/muss immer verschieden sein - wie herbivore ja auch schon erwähnt hat.

Wenn sich die Anwendungen den Speicher teilen sollen, könntest du Shared Memory verwenden

Das wurde mit .net 4.0 in Form von Memory-Mapped Files wesentlich vereinfacht. Ob du damit allerdings besser dran bist weiß ich nicht.

Alternativ könntest du mit WCF und NamedPipes-Bindung arbeiten und den Server den Lookup durchführen lassen, dann sind die Daten nur 1x geladen. Die Clients befragen nur den Server nach dem Wert.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"