it-swarm.com.de

Warum Python `memory error` mit list` append () `viele RAM links

Ich baue ein umfangreiches Datenwörterbuch aus einer Reihe von Textdateien auf. Während ich die Zeilen einliest und verarbeite, append(dataline) zu einer Liste.

Irgendwann erzeugt die append() eine Memory Error-Ausnahme. Beim Betrachten des Programms im Windows Task-Manager werden jedoch zum Zeitpunkt des Absturzes 4,3 GB und 1,1 GB frei angezeigt.

Daher verstehe ich nicht den Grund für die Ausnahme.

Python-Version ist 2.6.6. Ich denke, der einzige Grund ist, dass es nicht in der Lage ist, mehr RAM zur Verfügung zu stellen. Wenn dies der Fall ist, kann die Zuteilung erhöht werden?

21
Pete

Wenn Sie eine 32-Bit-Version von Python verwenden, sollten Sie eine 64-Bit-Version ausprobieren.

Es ist möglich, dass ein Prozess höchstens 4 GB von RAM mit 32-Bit-Adressen adressiert. In der Regel (je nach Betriebssystem) erhält man jedoch viel weniger. Es klingt, als könnte Ihr Python-Prozess diese Grenze erreichen. Die 64-Bit-Adressierung beseitigt diese Einschränkung.

edit Da Sie sich nach Windows fragen, ist die folgende Seite relevant: Speichergrenzen für Windows-Versionen . Wie Sie sehen, liegt das Limit pro 32-Bit-Prozess je nach Betriebssystemversion und -konfiguration bei 2, 3 oder 4 GB.

27
NPE

Wenn Sie offen sind, den Code umzustrukturieren, anstatt mehr Speicher darauf zu werfen, können Sie Folgendes erreichen:

data = (processraw(raw) for raw in lines)

dabei ist lines entweder eine Liste von Zeilen oder file.xreadlines() oder eine ähnliche.

5
nmichaels

Ich hatte ein ähnliches Problem bei der Verwendung einer 32-Bit-Version von Python in einer 64-Bit-Windows-Umgebung. Ich habe die 64-Bit-Windows-Version von Python ausprobiert und bin schnell mit den Scipy-Bibliotheken, die für 64-Bit-Fenster kompiliert wurden, in Schwierigkeiten geraten.

Die völlig freie Lösung, die ich implementiert habe, war 

1) Installieren Sie VirtualBox
2) Installieren Sie CentOS 5.6 auf der VM
3) Holen Sie sich die begehrte Python-Distribution (kostenlose 64-Bit-Linux-Version). 

Jetzt kann der gesamte von Numpy, Scipy und Matplotlib abhängige Python-Code so viel Speicher verwenden, wie ich Ram und verfügbaren Linux-Swap habe.

4
Stu

Bei der Auswertung eines Ausdrucks, der große numpy-Arrays enthielt, war ein ähnliches Problem aufgetreten (eines war eigentlich spärlich). Ich machte dies auf einem Rechner mit 64 GB Speicher, von dem nur etwa 8 GB verwendet wurden, und so war ich überrascht, das MemoryError zu bekommen.

Es stellte sich heraus, dass mein Problem das Senden von Array-Form war: Ich hatte versehentlich eine große Dimension dupliziert.

Es ging ungefähr so: 

  • Ich hatte ein Array mit Shape (286577, 1) übergeben, in dem ich (286577) erwartet hatte. 
  • Dies wurde von einem Array mit der Form (286577, 130) abgezogen. 
  • Da ich (286577) erwartete, habe ich [:,newaxis] im Ausdruck angewendet, um ihn nach (286577,1) zu bringen, damit er an (286577,130) gesendet wird. 
  • Als ich Shape (286577,1) übergab, produzierte [:,newaxis] Shape (286577,1,1) und die beiden Arrays wurden beide in Form (286577,286577,130) ... von Doubles gesendet. Bei zwei solchen Arrays sind das etwa 80 GB!
3
drevicko

Wie bereits erwähnt, benötigen Sie ein Python64-Bit (einer 64-Bit-Version von Windows). 

Beachten Sie, dass Sie mit einigen der grundlegenden Pakete, mit denen Sie möglicherweise arbeiten möchten, möglicherweise Konflikte und Probleme haben werden. Um dieses Problem zu vermeiden, würde ich Anaconda von Continuum Analytics empfehlen. Ich würde dir raten, nachzusehen :)

0
amaatouq