Was sind die workaround-Optionen für python-out of memory-Fehler?
Ich lese eine x -, y -, z-point-Datei (LAS) in python und in-memory-Fehler. Ich bin Interpolation unbekannter Punkte zwischen bekannten Punkte, die für ein Projekt an dem ich arbeite. Ich begann die Arbeit mit kleinen Dateien (< 5,000,000 Punkte) und war in der Lage zu Lesen/schreiben in ein numpy-array und python Listen mit kein problem. Ich erhalten haben, mehr Daten zu arbeiten (> von 50.000.000 Punkte) und jetzt ist mein code nicht mit einem MemoryError.
Was sind einige Optionen für den Umgang mit derart großen Datenmengen? Ich nicht haben, laden Sie alle Daten gleichzeitig in den Speicher, aber ich muss einen Blick auf die benachbarten Punkte mit scipy kd-Baum ich verwende Python 2.7 32-bit-auf eine 64-bit-Windows-XP-Betriebssystem.
Vielen Dank im Voraus.
EDIT: Code ist unten geschrieben. Ich habe code für lange Berechnungen und Definitionen der Variablen.
from liblas import file
import numpy as np
f = file.File(las_file, mode='r')
num_points = int(f.__len__())
dt = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('i', 'u2'), ('c', 'u1'), ('t', 'datetime64[us]')]
xyzict = np.empty(shape=(num_points,), dtype = dt)
counter = 0
for p in f:
newrow = (p.x, p.y, p.z, p.intensity, p.classification, p.time)
xyzict[counter] = newrow
counter += 1
dropoutList = []
counter = 0
for i in np.nditer(xyzict):
# code to define P1x, P1y, P1z, P1t
if counter != 0:
# code to calculate n, tDiff, and seconds
if n > 1 and n < scanN:
# code to find v and vD
for d in range(1, int(n-1)):
# Code to interpolate x, y, z for points between P0 and P1
# Append tuple of x, y, and z to dropoutList
dropoutList.append(vD)
# code to set x, y, z, t for next iteration
counter += 1
Verwenden Sie
np.loadtxt
oder np.genfromtxt
? Wenn ja, sind Sie Recht ineffizient für große Dateien. (Nicht zu stecken, meine Antwort, aber es ist relevant: stackoverflow.com/a/8964779/325565 ) können Sie entweder Rollen Sie Ihre eigenen reader und verwenden Sie fromiter
oder, in diesen Tagen, verwenden Sie einfach pandas. (Pandas passiert zu haben, ein sehr effizientes whitespace-getrennte ascii-reader.)InformationsquelleAutor Barbarossa | 2013-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unabhängig von der Größe des RAM in Ihrem system, wenn Sie mit 32-bit-python, haben Sie eine praktische Grenze von etwa 2 GB RAM für Ihre Anwendung. Es gibt eine Reihe von Fragen auf, SO dass diese Adresse (z.B., siehe hier). Da die Struktur, die Sie verwenden in Ihrem ndarray ist 23 bytes und die, die Sie Lesen, über 50,000,000 Punkte, die bereits bringt Sie in etwa 1 GB. Sie haben sich nicht enthalten, den rest des Codes, so dass nicht klar ist, wie viel zusätzlichen Speicher verbraucht wird, die von anderen teilen des Programms.
Wenn Sie noch gut über 2 GB RAM in Ihrem system, und Sie werden weiterhin arbeiten auf großen Datenmengen, sollten Sie 64-bit-python zu bekommen, um dieses ~ 2-GB-Grenze.
InformationsquelleAutor bogatron
Speichern Sie die Punkte in eine binäre Datei auf der Festplatte und verwenden Sie dann numpy.memmap ,werden etwas langsamer sein, aber könnte nicht Schaden (je nach Algorithmus).
Oder versuchen Sie die 64-bit-version von Python; Sie brauchen wahrscheinlich mehr als 2 GB Daten.
Schließlich, überprüfen Sie den code, wie es funktioniert mit den Daten. Mit, dass viele Elemente, die Sie sollten nicht versuchen, Sie zu kopieren /Klonen Sie das array. Views benutzen.
Wenn alles andere fehlschlägt, versuchen Sie eine 64-bit-version von Linux (da werden Sie nicht bekommen eine 64-bit-Windows-kostenlos).
Ich bin nicht vertraut mit dem Lesen/schreiben von binären Dateien auf die Festplatte (ich bin ein newb mit python).
Ich denke, dass ein Teil der Dokumentation bezieht sich auf
numpy.save()
: docs.scipy.org/doc/numpy/reference/routines.io.htmlEs klingt wie das linux-Teil ist für die Kosten Bedenken.
InformationsquelleAutor Aaron Digulla