Ich habe ein Python-Skript, das eine große CSV-Datei importiert und dann die Anzahl der Vorkommen jedes Wortes in der Datei zählt und dann die Anzahl in eine andere CSV-Datei exportiert.
Aber was passiert ist, dass, sobald dieser Zählteil fertig ist und der Export beginnt, es heißt Killed
im Terminal steht.
Ich denke nicht, dass dies ein Speicherproblem ist (wenn es so wäre, würde ich wahrscheinlich einen Speicherfehler bekommen und nicht Killed
).
Könnte es sein, dass der Prozess zu lange dauert? Wenn ja, gibt es eine Möglichkeit, die Auszeit zu verlängern, damit ich dies vermeiden kann?
Hier ist der Code:
csv.field_size_limit(sys.maxsize)
counter={}
with open("/home/alex/Documents/version2/cooccur_list.csv",'rb') as file_name:
reader=csv.reader(file_name)
for row in reader:
if len(row)>1:
pair=row[0]+' '+row[1]
if pair in counter:
counter[pair]+=1
else:
counter[pair]=1
print 'finished counting'
writer = csv.writer(open('/home/alex/Documents/version2/dict.csv', 'wb'))
for key, value in counter.items():
writer.writerow([key, value])
Und das Killed
passiert, nachdem finished counting
gedruckt wurde, und die vollständige Nachricht lautet:
killed (program exited with code: 137)
killed
Nachricht kommt, aber wenn es darum geht, eine Art Systemspeicherlimit zu überschreiten, können Sie dies möglicherweise beheben, indem Siecounter.iteritems()
stattcounter.items()
in Ihrer letzten Schleife verwenden. Gibt in Python 2items
eine Liste der Schlüssel und Werte im Wörterbuch zurück, die bei sehr großem Speicher möglicherweise viel Speicher benötigen. Im Gegensatz dazuiteritems
ist ein Generator, der zu einem bestimmten Zeitpunkt nur wenig Speicher benötigt.Antworten:
Der Exit-Code 137 (128 + 9) zeigt an, dass Ihr Programm aufgrund des Empfangssignals 9 beendet wurde
SIGKILL
. Dies erklärt auch diekilled
Nachricht. Die Frage ist, warum haben Sie dieses Signal erhalten?Der wahrscheinlichste Grund ist wahrscheinlich, dass Ihr Prozess eine bestimmte Anzahl von Systemressourcen überschritten hat, die Sie verwenden dürfen. Abhängig von Ihrem Betriebssystem und Ihrer Konfiguration kann dies bedeuten, dass Sie zu viele geöffnete Dateien, zu viel Dateisystemspeicherplatz oder etwas anderes verwendet haben. Am wahrscheinlichsten ist, dass Ihr Programm zu viel Speicher belegt hat. Anstatt zu riskieren, dass Dinge kaputt gehen, wenn die Speicherzuweisungen fehlschlagen, hat das System ein Kill-Signal an den Prozess gesendet, der zu viel Speicher verwendet.
Wie ich bereits erwähnt habe, besteht ein Grund dafür, dass Sie nach dem Drucken möglicherweise an ein Speicherlimit stoßen,
finished counting
darin, dass Ihr Aufrufcounter.items()
in Ihrer letzten Schleife eine Liste zuweist, die alle Schlüssel und Werte aus Ihrem Wörterbuch enthält. Wenn Ihr Wörterbuch viele Daten enthält, ist dies möglicherweise eine sehr große Liste. Eine mögliche Lösung wäre die Verwendungcounter.iteritems()
eines Generators. Anstatt alle Elemente in einer Liste zurückzugeben, können Sie sie mit viel weniger Speicherbedarf durchlaufen.Daher würde ich vorschlagen, dies als letzte Schleife zu versuchen:
Beachten Sie, dass in Python 3
items
ein Objekt "Dictionary View" zurückgegeben wird, das nicht den gleichen Overhead wie die Version von Python 2 hat. Es wird ersetztiteritems
. Wenn Sie also später Python-Versionen aktualisieren, ändern Sie die Schleife wieder in den ursprünglichen Zustand.quelle
Es gibt zwei Speicherbereiche: den Stapel und den Heap. Auf dem Stapel wird der aktuelle Status eines Methodenaufrufs gespeichert (dh lokale Variablen und Referenzen), und auf dem Heap werden Objekte gespeichert. Rekursion und Erinnerung
Ich vermute, es gibt zu viele Schlüssel im
counter
Diktat, die zu viel Speicher der Heap-Region verbrauchen, sodass die Python-Laufzeit ein OutOfMemory auslöst Ausnahme .Erstellen Sie zum Speichern kein riesiges Objekt, z . B. den Zähler .
1.StackOverflow
Ein Programm, das zu viele lokale Variablen erstellt.
2.OutOfMemory
Ein Programm, das einen Riesen erschafft,
dict
enthält zu viele Schlüssel.Verweise
quelle
Ich bezweifle, dass irgendetwas den Prozess beendet, nur weil es lange dauert. Generisch getötet bedeutet, dass etwas von außen den Prozess beendet hat, aber in diesem Fall wahrscheinlich nicht, wenn Strg-C gedrückt wird, da dies dazu führen würde, dass Python bei einer KeyboardInterrupt-Ausnahme beendet wird. Außerdem würden Sie in Python eine MemoryError-Ausnahme erhalten, wenn dies das Problem wäre. Was möglicherweise passiert, ist, dass Sie auf einen Fehler in Python oder Standardbibliothekscode stoßen, der einen Absturz des Prozesses verursacht.
quelle
SIGKILL
, es sei denn, Python hatraise(SIGKILL)
aus irgendeinem Grund irgendwo in seinem Code einen Fehler .Höchstwahrscheinlich ist Ihnen der Speicher ausgegangen, sodass der Kernel Ihren Prozess abgebrochen hat.
Hast du von OOM Killer gehört ?
Hier ist ein Protokoll eines Skripts, das ich für die Verarbeitung eines großen Datensatzes aus CSV-Dateien entwickelt habe:
Es wurde aus genommen
/var/log/syslog
.Grundsätzlich:
Hier ist ein Artikel über das OOM-Verhalten .
quelle
Ich hatte gerade das gleiche Problem, als ich versuchte, ein Python-Skript aus einem freigegebenen Ordner in
VirtualBox
der neuen Ubuntu 20.04 LTS auszuführen . Python wurdeKilled
beim Laden meiner persönlichen Bibliothek gerettet . Als ich den Ordner in ein lokales Verzeichnis verschoben habe, ist das Problem behoben. Es scheint, dass dieKilled
Stopp während der ersten Importe meiner Bibliothek aufgetreten ist, da ich Nachrichten über fehlende Bibliotheken erhalten habe, nachdem ich den Ordner verschoben habe.Das Problem wurde behoben, nachdem ich meinen Computer neu gestartet hatte.
Daher möchten Benutzer möglicherweise versuchen, das Programm in ein lokales Verzeichnis zu verschieben, wenn es sich um eine Freigabe handelt, oder wenn es sich um ein vorübergehendes Problem handelt, das nur einen Neustart des Betriebssystems erfordert.
quelle