Laden...

Memorystream für IPC möglich?

Erstellt von key-board vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.668 Views
K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren
Memorystream für IPC möglich?

Hallo. Ich hoffe ich bin hier richtig. Und zwar schreibe ich für meine studienarbeit eine kleine Simmulationssoftware. Die Herrausforderung darin besteht, dass ich mir c# selber beigebracht habe und die Simulation auf ipc (inter Prozess Kommunikation) aufbaut.
Ich muss Daten von mehreren Clients zu einem Server schicken, welcher diese verarbeitet und den Clients wieder zur verfügung stellt, um ihre simulation erneut durchzuführen. Server und jeder Client liegen als eigenstendiges Programm auf dem Rechner vor. Aber alle auf dem SELBEN Rechner.
Übertragen werden 1D Arrays, wobei der Server aus allen empfangenen 1D Arrays ein 2D Array macht um die Daten zu verarbeiten und daraus ein neues 1D Array zu bilden. Das soll auch gespeichert werden zur späteren Datenanalyse. An und für sich funktioniert das momentan schon soweit, dass die Daten mittels FileStream an eine Datei gesendet werden und von da auch wieder gelesen werden. Da das über die Festplatte läuft ist das mit mehreren clients (momentan 5, später noch mehr) nicht die eleganteste und schnellste lösung.
Gibt es eine möglichkeit das evt über den Arbeitsspeicher laufen zu lassen und den Speicherort dieser "Datei" herauszufinden und an die Clients zu übergeben?

Ich habe auch schon Pipestream probiert um die Daten direckt ohne den Umweg über eine Datei zu übergeben aber da bin ich leider jämmerlich dran gescheitert...

Wenn mir da vieleicht nochmal jemand einen Tipp geben kann wäre ich echt dankbar.

Entwicklungssoftware: Visual Studio 2012

1.361 Beiträge seit 2007
vor 10 Jahren

Hi key-board,

nachfolgend meine Gedanken hierzu:

  • Warum verwendest du eigenständige Prozesse statt Threads in einem einzigen? Gerade wenn du garantiert auf einem einzigen PC läufst, hast du weitaus komfortablere Möglichkeiten zur Parallelisierung (PLinq, ThreadPool, Tasks, TPL, ...)

  • Was du als "Datei im Arbeitsspeicher" beschreibst, nennt sich "Memory-Mapped File" und mit dem MemoryMappedViewStream gibt es .NET Klassen für deren Handling.

  • Komfortabler ist es auf jeden Fall, wenn du auf einer Kommunikations-Middleware aufbaust. Diese Middlewares kann man komfortabel konfigurieren, oder erkennen sogar automatisch, was die effizienteste Kommunikation zwischen zwei Teilnehmern ist. (Ob nun IPC zwischen zwei Prozessen auf dem selben PC, oder IP-Verbindungen zwischen zwei Rechnern, ...)
    Hier könntest du folgendes nutzen*Message Passing Interface (MPI), wofür es mit MPI.NET auch ein Projekt gibt *WCF mit netNamedPipeBinding für Interprozesskommunikation oder netTcpBinding im Netzwerk. *Je nachdem, wie dein Kommunikationsschema aussieht, bietet sich vielleicht auch MessageQueuing an. Gerade bei einem Master-Slave-Szenario wo die Slaves einfach immer mit Arbeit versorgt sein sollen für maximalen Durchsatz bietet sich Queuing an. Hierfür kannst du entweder auch das passende WCF Binding netMsmqBinding wählen, oder auf andere MQ-Server wie RabbitMQ mit .NET Bindings wechseln.

Das schöne ist, dass du mit einer solche Middleware die Möglichkeit hast, die Programme relativ einfach auf UNTERSCHIEDLICHE Rechner zu verteilen. Und schon skaliert deine Anwendung besser, du hast "Cluster-Unterstützung" und die Simulation läuft einfach schneller ab. Klingt doch nicht schlecht, oder? 😃

K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Hi
Danke für die tipps. Ich werd mich auf jeden fall mal schlau machen.
Warum die alle als eigenes programm vorliegen hat einen einfachen grund. Die Simulation soll beliebig erweitert werden können ohne immer alles neu kompailieren zu müssen. Außerdem kann die zusammenstellung der clients unterschiedlich sein. Zur Info es handelt sich um eine Verbindnetzsimulation, wobei der server das Netz und die Clients verschiedenste Energieanlagen darstellen. Im Endausbau soll das ne "echtzeit" simulation werden, die dann als Laborversuch läuft. Als Rechner steht ein 8-Kern Prozi zur Verfügung.
Das Kommunikationsschema ist ein Stern. Alle Clients sind mit dem Server verbunden aber nicht Untereinander. Die meisten bekommen dann noch ne gui, wobei ich die noch nicht gemacht habe, weil meine ersten versionen immer eingefrohren sind...

K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Hi
Also ich versuch mich gerade an der Erstellung vom MemoryMappesFiles

Erstellen und reinschreiben tu ich die mit :

 using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("memfile", 10000))
            {          
       using (MemoryMappedViewStream stream = mmf.CreateViewStream())

                {
                    BinaryWriter writer = new BinaryWriter(stream);
                    writer.Write(arr);
                }
}

arr ist ein Byte [] arr

Lesen tu ich in einer anderen Anwendung so:


 using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("memfile"))
            {
       using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                {

Das Problem ist, dass der Client das "memfile" nicht findet...
Was muss ich beim erstellen beachten, damit der Client das mmf finden kann?

W
872 Beiträge seit 2005
vor 10 Jahren

An Deiner Stelle würde ich Dir raten, Dich entweder mit WCF oder NServiceBus oder einer anderen Middleware zu beschäftigen. Auch Sockets sind ok, da findest Du auch mittlerweile in jedem Buch Beispiele.
MemoryMappedFile sind nur dann interessant, wenn sehr viele Daten hochperformant ausgetauscht werden müssen.
Fuer die Serialisierung wuerde ich mir ProtocolBuffer anschauen - damit koennen auch der Client und der Server mit unterschiedlichen Versionen arbeiten