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.

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

Schreibe einen Kommentar