Daten vom heap schnell an externes Programm übergeben
-
Hi,
Ich rufe in meinem Code ein weiteres Programm auf, dem ich mehrere 100MB an Daten übergebe. Z.z. übergebe ich die Daten als Datei, was zu langsam ist, vermutlich weil die Datei erst auf die Festplatte geschrieben wird. Das mache ich über std::ofstream::put(char).
Wie kann ich diesen Vorgang beschleunigen? Kann ich die Datei einfach über den Arbeisspeicher übergeben? Zwar kann das aufgerufene Programm auch von stdin lesen, allerdings konnte ich nicht herausfinden wie ich in meinem Code die Daten in das Programm pipen kann um dann darauf zu warten bis es beendet wurde.Danke,
Cream
-
Mit Shared Memory. http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx http://linux.die.net/man/2/shmget (Links eher geraten, denn wirklich geschaut, ob sie genau passen)
-
Du solltest put erst einmal durch write ersetzen und damit deine Daten in einem Rutsch schreiben. Damit wird das bereits deutlich schneller gehen. Normalerweise landen Schreibvorgänge erst einmal im Filecache und werden erst später auf die Platte geschrieben ohne dein Programm zu blockieren. Unter Windows kannst du CreateFile auch FILE_ATTRIBUTE_TEMPORARY mitgeben, was das OS veranlasst, die Daten nach Möglichkeit im RAM zu belassen.
Du kannst auch memory mapped files verwenden. Das ganze geht zwar auch über eine Datei, aber vermutlich hat das OS es nicht so eilig, das ganze auf die Platte zu bringen.
Ist aber nur eine Vermutung, also am besten einfach ausprobieren und die Zeiten vergleichen.
-
Athar schrieb:
Du solltest put erst einmal durch write ersetzen und damit deine Daten in einem Rutsch schreiben. Damit wird das bereits deutlich schneller gehen. Normalerweise landen Schreibvorgänge erst einmal im Filecache und werden erst später auf die Platte geschrieben ohne dein Programm zu blockieren. Unter Windows kannst du CreateFile auch FILE_ATTRIBUTE_TEMPORARY mitgeben, was das OS veranlasst, die Daten nach Möglichkeit im RAM zu belassen.
Danke für eure Hilfe! Die write Methode scheint für meine Belange auszureichen und ist im vergleich zu put erheblich schneller

THX!
Cream
-
volkard schrieb:
Mit Shared Memory. http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx http://linux.die.net/man/2/shmget (Links eher geraten, denn wirklich geschaut, ob sie genau passen)
Woher willst du wissen, ob er Microsoft benutzt?

Wenn ja: Such dir nen passendes Forum!!!
Hier eine schöne Alternative, falls du es doch noch benötigen solltest:
http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess.html
-
CSpille schrieb:
Woher willst du wissen, ob er Microsoft benutzt?

Wenn ja: Such dir nen passendes Forum!!!
Hast Du wirklich beide Links angeschaut?