2016-09-22 3 views
0
import shapefile 
data = shapefile.Reader("data_file.shp") 
shapes = data.shapes() 

Mein Problem ist, dass die Formen aus den Shape-Datei Lesern immer gibt mir eine Ausnahme MemoryError wenn Pyshp verwendet. Die .shp Datei ist ziemlich groß, bei 1,2 gB. Aber ich benutze nur 3% der 32gB meiner Maschine, also verstehe ich es nicht.Speicherfehler auf großer Shape-Datei in Python

Gibt es einen anderen Ansatz, den ich nehmen kann? Kann die Datei in Python in Blöcken verarbeitet werden? Oder verwenden Sie ein Werkzeug, um die Datei in Ritzen zu verschütten, und bearbeiten Sie sie dann einzeln?

Antwort

1

Obwohl ich es nicht testen konnte, sollte Pyshp in der Lage sein, es ungeachtet der Dateigröße oder Speichergrenzen zu lesen. Beim Erstellen der Reader Instanz wird nicht die gesamte Datei geladen, sondern nur die Headerinformationen.

Es scheint das Problem hier ist, dass Sie die shapes() Methode verwendet haben, die alle Form Informationen auf einmal in Speicher liest. Dies ist normalerweise kein Problem, aber es ist mit Dateien so groß. Als allgemeine Regel sollten Sie stattdessen die iterShapes() Methode verwenden, die jede Form nacheinander liest.

+0

Ich kann feststellen, dass das Problem nicht mit der Erstellung des Objekts, sondern mit der Methode 'shapes()' zusammenhing. Das Problem war jedoch, dass ich 32-Bit-Python verwendete, das nur 32 GB RAM adressieren kann. Als ich die 64-Bot-Version installierte, ging das Problem weg. Wenn die 'iterShapes()' Methode nur eine einzelne Form gleichzeitig in den Speicher lädt, werde ich das natürlich verwenden – Mawg

3

Zitiert aus this answer von thomas:

Die MemoryError Ausnahme, dass Sie sehen werden, ist das direkte Ergebnis aus verfügbarem RAM. Dies kann entweder durch das von Windows vorgegebene 2-GB-Pro-Programmlimit (32bit programs) oder durch das Fehlen von verfügbarem RAM auf Ihrem Computer verursacht werden. (Diese link ist zu einer vorherigen Frage). Sie sollten in der Lage sein, die 2 GB mit einer 64-Bit-Kopie von Python zu erweitern, sofern Sie eine 64-Bit-Kopie von Windows verwenden.

Also versuchen Sie eine 64-Bit-Kopie von Python oder bieten Sie mehr Details über Ihre Plattform und Python-Versionen.

+0

Obwohl es vielleicht richtig ist, ist dies mehr ein Kommentar als eine Antwort ... Eine Zeile und die Hälfte ist eine Frage? –

+1

Ich habe nicht genug Bewertung zu kommentieren, aber ich möchte immer noch helfen –

+0

Nick, Sie könnten Recht haben. Wie kann ich es sagen? Wenn ich den Interperter laufen lasse, sehe ich 'Python 2.7.11 (v2.7.11: 6d1b6a68f775, 5. Dez. 2015, 20:32:19) [MSC v.1500 32 Bit (Intel)] auf win32' – Mawg