So vermeiden Sie [Errno 12] Speicherfehler, die durch die Verwendung des Unterprozessmoduls verursacht wurden, können nicht zugeordnet werden
Kompletten Arbeitstag Testfall
Natürlich je nach Speicher auf dem lokalen und remote-Maschinen, array-Größen anders sein wird.
z1 = numpy.random.rand(300000000,2);
for i in range(1000):
print('*******************************************\n');
direct_output = subprocess.check_output('ssh blah@blah "ls /"', shell=True);
direct_output = 'a'*1200000;
a2 = direct_output*10;
print(len(direct_output));
Aktuellen Anwendungsfall
Falls es hilft, mein Anwendungsfall ist wie folgt:
I Ausgabe von db-Abfragen, speichern Sie dann die daraus resultierenden Tabellen auf der remote-Maschine. Dann möchte ich Sie zu übertragen über ein Netzwerk und Analysen. Bisher habe ich sowas wie das folgende in python:
#run a bunch of queries before hand with the results in remote files
....
counter = 0
mergedDataFrame = None
while NotDone:
output = subprocess.check_output('ssh blah@blah cat /data/file%08d'%(counter))
data = pandas.read_csv(...)
#do lots of analysis, append, merge, numpy stuff etc...
mergedDataFrame = pandas.merge(...)
counter += 1
Irgendwann erhalte ich die folgende Fehlermeldung am check_output Befehl: [Errno 12] Cannot allocate memory
Hintergrund
Dank der unten Fragen, ich denke ich habe eine Idee, was falsch ist. Es gibt eine Reihe von Lösungen gepostet, und ich bin versucht zu bestimmen, welche der Lösungen vermeiden Sie die [Errno 12] Cannot allocate memory Fehler im Zusammenhang mit dem Teilprozess Implementierung mit fork/Klon.
Python-subprocess.Popen "OSError: [Errno 12] Cannot allocate memory" Dies gibt die zugrunde liegende Diagnose und schlägt vor, einige workaround wie Laich-script etc...
Grundlegendes zu Python-Gabel-und Speicher-Zuordnungsfehler Schlägt mit rfoo zu umgehen, ist der Teilprozess Einschränkung von fork/Klon-und Laich-Kind-Prozess, und kopieren Sie den Speicher, usw... Dies scheint zu bedeuten, eine client-server-Modell
Was ist der einfachste Weg, um SSH mit Python? , aber ich habe die zusätzlichen Einschränkungen, die ich nicht verwenden können, Teilprozess, aufgrund Speicher Einschränkungen und Gabel/clone Umsetzung? Die Lösungen schlägt mit paramiko oder etwas drauf gebaut, andere schlagen vor, subprocess (die ich gefunden habe funktioniert nicht in meinem Fall).
Gab es ähnliche Fragen, aber die Antworten haben oft darüber gesprochen, Datei-Deskriptoren, die Schuldigen (in diesem Fall sind Sie nicht), hinzufügen von mehr RAM auf dem system ( ich kann dies nicht tun), ein Upgrade auf x64 ( ich bin bereits auf x64). Einige Hinweise auf das problem der ENOMEM. Ein paar Antworten erwähnen, versuchen zu bestimmen, ob der Teilprozess.Popen (in meinem Fall check_output) ist nicht richtig reinigen Sie die Prozesse, aber es sieht aus wie S. Lott und andere Stimmen zu, dass der Teilprozess code an sich ist richtig Aufräumen.
- Python memory allocation error mit subprocess.Popen
- Python IOError kann nicht Speicher obwohl es eine Menge
- Cannot allocate memory auf Popen Befehle
- Python-subprocess.Popen erroring mit OSError: [Errno 12] Cannot allocate memory nach Zeit
Habe ich durchsucht den source-code auf github https://github.com/paramiko/paramiko/search?q=Popen&type=Code und es scheint Teilprozess in der proxy.py Datei.
Aktuelle Fragen
Bedeutet dies, dass letztlich paramiko ist mit dem Popen oben beschriebene Lösung, die Probleme haben wird, wenn das python-der Speicherbedarf wächst und wiederholt Popen Anrufe wegen der clone/fork Umsetzung?
Wenn paramiko wird nicht funktionieren, gibt es einen anderen Weg das zu tun, was ich bin auf der Suche für eine client-seitige Lösung? Oder wird eine client/server/socket-Lösung werden benötigt? Wenn dem so ist, wird jeder von rfoo, tornado, oder zeromq, http-übertragungen, die hier arbeiten?
Hinweise
Ich bin mit 64-bit-linux-8GB Arbeitsspeicher. Ich will nicht zu verfolgen, die Optionen für den Kauf mehr RAM.
InformationsquelleAutor der Frage Paul | 2013-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie laufen aus dem Speicher, können Sie erhöhen möchten Ihre swap-Speicher. Oder haben Sie vielleicht kein swap aktiviert. In Ubuntu (sollte auch für andere Distributionen) können Sie Ihre swap durch:
wenn es leer ist bedeutet das, Sie haben keine swap aktiviert. Hinzufügen einer 1-GB-swap:
Fügen Sie die folgende Zeile, um die
fstab
um die swap-dauerhaft.Quelle und mehr Informationen können gefunden werden hier.
InformationsquelleAutor der Antwort Nima
Wenn Sie ' re running out of memory, es ist wahrscheinlich, weil Teilprozess ist zu Lesen versucht, zu viel in den Speicher in der gleichen Zeit. Die Lösung, andere als mit einem redirect auf eine lokale Datei, ist wahrscheinlich zu verwenden popen-ähnliche Funktionalität mit stdin/stdout-pair-Mädchen, die gelesen werden können von einer wenig in einer Zeit.
InformationsquelleAutor der Antwort dstromberg
Dies sollte es tun:
http://docs.python.org/3.3/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3
Diese Weise können Sie Lesen Linien oder Blöcke, anstatt die ganze Sache auf einmal.
InformationsquelleAutor der Antwort dstromberg