ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
843
843
EMPFEHLEN
-
Hallo allerseits,
Ich habe soweit zahlreiche Foren durchforstet und ganz viele Posts gelesen, doch nichts gefunden, was mich auch einen Schritt weiterbringt - hoffentlich weiß einer von euch was
Also, ich hab was programmiert, das eine externe Software startet und ihr die nötigen Parameter und Input gibt - mein Skript kontrolliert den Ablauf einer Simulation, die Simulationssoftware rechnet, und gibt die Werte als Output zurück. Jetzt hab ich das Problem, daß - auf Linux ausgeführt - sich das ganze ziemlich schleppt, weil auf Linux untypischerweise der Output gepuffert wird und erst geschrieben wird, wenn die Simulationssoftware fertig ist mit Rechnen. Ich würde das sehr gern anders haben, doch ich habe mir sagen lassen, daß dies eine Sache zwischen Linux und der externen Anwendung sei, und sich kaum beeinflußen ließe - stimmt das? Gibt es vielleicht einen Umweg, auf den ich den Output simultan schreiben lassen kann?
Viele Grüße,
ivka_sto
-
Hi!
Da kann man was machen. Doch zuerst solltest Du uns wissen lassen, in welcher Sprache Du "was geschrieben hast"...
Gruß
Enum
-
Das ging ja blitzschnell .. Danke

Mein Skript ist in Python.
-
26.10.09 14:28 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Wie startest du denn die externe Anwendung? Nutzt du das subprocess Modul?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja, die externe Software wird über subprocess.popen gestartet:
simu = subprocess.popen(cmd, stderr = subprocess.PIPE)
simu.wait()
out_file = open('soundso', 'r')
out_content = out_file.readlines()
out_file.close()
for i in range (-1, -5, -1):
k = out_content[i].strip()
if (k.find('ExitNum') != -1):
print 'exit number: ' + str(k[34:]).strip()
else:
pass
-
26.10.09 14:47 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Nein, es ist kein Scherz. Mit wait() halte ich nur den Python-Skript an - das dürfte, meiner Meinung nach, das Schreiben der Output-Files in keinster Weise betreffen, da sie von der externen Anwendung generiert werden.
Das, was nach wait() steht (also das Lesen der Files) kommt an einer anderen Stelle, und der Code dazwischen hat mit meiner Frage nichts zu tun, deshalb hab ich den weggelassen.
Sorry für die Tags.
-
26.10.09 15:55 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Also dauert es dir einfach zu lange bis die externe Anwendung fertig ist? Wie kommst du darauf das es mit einem Ausgabepuffer zu tun hat? Evtl. solltest du mal den Autor des ext. Programmes fragen warum es so lange braucht?!
Hast du mal die Systemauslastung und die I/O kontrolliert?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Aber das Auslesen des Files wird beeinflusst.Mit wait() halte ich nur den Python-Skript an - das dürfte, meiner Meinung nach, das Schreiben der Output-Files in keinster Weise betreffen, da sie von der externen Anwendung generiert werden.
Das outfile wird doch erst geöffnet wenn die Simulation durchgelaufen ist. Also ist es kein Wunder, dass dein Skript die Daten erst dann bekommt, da es sie gar nicht früher abruft. Die Frage ist nun ob das externe Programm die Ausgabe erst schreibt wenn es fertig ist (was wahrscheinlich ist) oder ständig schreibt was einfach nur imperformant wäre.
Ich denke du solltest die communicate methode des popen objects nutzen:
Code :1 2 3 4 5 6
simu = subprocess.popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) outcontent="" while 1: print simu.communicate()[0] # communicate() returns a tuple (stdout,stderr) if whatever happens: break
Geändert von Raubkopierer (26.10.09 um 16:14 Uhr)
Albert Einstein sagte einmal:
Es gibt 2 Dinge die unendlich sind: Das Universum und die Dummheit der Menschen. Beim Ersten bin ich mir allerdings nicht ganz sicher.
Stoppt die Vorratsdatenspeicherung!
-
Nein, auch nicht. Es stört mich, das der Output erst geschrieben wird, wenn die Simulationssoftware fertig gerechnet hat. Gerade weil einer der Entwickler gesagt hat, daß das untypisch sei, und es selber womöglich auf Linux geschoben hat - er hat gesagt, normalerweise wird der Output parallel mit dem Rechnen geschrieben. Dann könnte ich schon im Laufe der Rechnung einen Fehler erkennen, sonst rechnet das Programm weiter.
Hoffe die Beschriebung war jetzt genauer
-
-
Hi!
Hast Du die Simulationssoftware mal "von Hand" gefüttert und Dich vergewissert, dass Sie erst gegen Ende des Prozesses Daten schreibt?
Gruß
Enum
-
26.10.09 16:44 #13
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Nein könntest du nicht. Das Programm rechnet ja in jedem Fall weiter da du auf die Beendigung des Programmes wartest. Also irgendwas stimmt da mit deinem Ansatz überhaupt nicht.
Und wie soll ein Programm nach der Beendigung noch irgendwas schreiben?
Wie überprüfst du denn das es erst später schreibt? Welches Dateisystem wird da eingesetzt?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
@deepthroat:
Doch, könnte ich schon. Wenn ich zur Laufzeit des Programms überprüfen kann, ob eine Fehlermeldung ausgegeben worde ist, werd ich auf das wait() natürlich verzichten. Nach Beendigung des Rechnens, nicht nach Beendigung des Programms.
Sorry, wie soll ich rausfinden, welches File-System eingesetzt wird?
@Enumerator:
Ja, tut es trotzdem. Ich hab es auch manuell über die Konsole gestartet, kommt aufs Gleiche raus. Und zwar, es ist ein pid-File vorhanden, solange das Programm rechnet - solange wird nichts geschrieben. Dann verschwindet diese PID aus der Liste der aktuellen Prozesse, und gleich werden die Files unter einer anderen PID geschrieben. Ich denke, das Programm rechnet, bricht kurz ab, und schreibt dann den Output, der solange gepuffert worden ist. Anders kann ich es mir nicht erklären.
-
Das ganze hängt in meinen Augen wirklich mit den IO-Scheduler des Kernels zusammen, der die Vorgänge entsprechend optimiert. Deshalb haben FDs ja auch die Methode flush() mit der man das Schreiben erzwingen kann.
An deiner Stelle würde ich einmal meine Codevariante testen, die von diesem Problem verschont bleiben sollte (zusätzlich gibt es in der Python Referenz noch einen Hinweis, dass wait() u.U. blockierend wirken kann wodurch dein Problem erklärt werden könnte. Stattdessen wird zu communicate() geraten).
Weiter wäre es wirklich gut zu wissen um welche Software es sich konkret handelt, damit man womöglich selbst einmal testen kann.
Edit: Zur Frage des Dateisystems: Selbiges ist für den Zeitpunkt des Schreibens vollkommen unerheblich. Ich weiß schon, dass ihr auf Systeme wie ReiserFS und XFS hinaus wollt, die in bestimmten Zyklen schreiben doch das sollte durch die Planung des Kernels keinen Einfluss auf das Auslesen besagter Daten haben. Wiederrum wird dies durch die Nutzung von communicate() und dem Verzicht auf jegliche File-Objects komplett eleminiert.
Die Erklärung scheint recht mangelhaft zu sein von Seiten des Programmierers zumindestens was die fachliche Richtigkeit anbelangt. Ich bezweifel, dass er Threads benutzt (Threads sind pfui etc.
)um eine wirkliche Paralellisierung zu erreichen. Außerdem kommt hinzu, dass er fahrlässig die Verantwortung von sich weiß obwohl er womöglich einfach oben genanntes "flush" seiner Sprache vergessen hat. Natürlich sind das nur Vermutungen.
Geändert von Raubkopierer (26.10.09 um 17:50 Uhr)
Albert Einstein sagte einmal:
Es gibt 2 Dinge die unendlich sind: Das Universum und die Dummheit der Menschen. Beim Ersten bin ich mir allerdings nicht ganz sicher.
Stoppt die Vorratsdatenspeicherung!
Ähnliche Themen
-
mail() - einmal klappt, einmal nicht?!
Von stega im Forum PHPAntworten: 1Letzter Beitrag: 09.10.09, 12:45 -
Vista Sound-Output aufzeichnen - suche Software dafür
Von Veränderung im Forum Audiotechnik, Recording & Audio-SoftwareAntworten: 6Letzter Beitrag: 13.05.09, 14:02 -
Bei nebeneinanderliegenden divs einmal Pixel und einmal Prozent möglich?
Von mofl im Forum CSSAntworten: 2Letzter Beitrag: 10.05.06, 12:24 -
2 Fragen : Einmal Google und einmal Dreamwaver
Von PLAZO im Forum HTML & XHTMLAntworten: 10Letzter Beitrag: 26.05.05, 22:46 -
2. Fragen: einmal wat mit include und einmal Operatoren
Von Tim C. im Forum PHPAntworten: 1Letzter Beitrag: 06.03.02, 15:55





Zitieren

Login





