Ich versuche, eine empirische kumulative Verteilungsfunktion (CDF) von Daten aus einem 380-Gb-Binär-Raster zu plotten. Mit nur einer kleinen Maske der Daten funktioniert der folgende Code perfekt.Python-Lesen sehr große Raster und plotten empirische kumulative Verteilungsfunktion, Speicherfehler
import numpy as np
import matplotlib.pyplot as plt
dem_name = open('./raster.dem','rb')
vals = np.fromfile(dem_name,dtype='float32')
vals = np.negative(vals[vals!=-9999])
vals = np.sort(vals)
y = np.arange(1.,len(vals)+1.)/len(vals)
plt.plot(vals,y)
Wenn ich jedoch versuche, das ganze Raster mit diesem Code zu laden, gibt es offensichtlich einen Speicherfehler. Mein Computer verfügt über 9 TB Speicherplatz, ist aber auf 16 GB RAM beschränkt. Daher habe ich numpy.memmap verwendet, um die Rasterwerte in ein Array zu übertragen.
dem_name = open('./raster.dem','rb')
vals = np.memmap(dem_name,dtype='float32','r')
Dies funktioniert, aber ich brauche die nodata Werte (-9999) aus dem Raster trimmen, schalten Sie das Vorzeichen der Werte (negative Werte positiv wird) und die Werte vom niedrigsten zum höchsten sortieren.
vals_real = np.memmap(np.sort(np.negative(vals[vals!=-9999])))
Diese für ein paar Stunden läuft und dann gibt einen Speicherfehler.
Der y-Array,
y = np.arange(1.,len(vals)+1.)/len(vals)
ist auch zu groß im RAM gespeichert wird (gibt einen Speicherfehler), aber ich kann nicht herausfinden, wie das Array als memmap Objekt zu speichern.
Ist es richtig, dass, um das Plotten nimmt auch Speicher, so dass ich genug Speicherplatz für 2x die Größe der Raster-Datei (2x 380 GB) benötigen?
Zusammenfassend muss ich das riesige Raster in Python lesen und eine CDF plotten. Es ist sehr einfach mit einem kleinen Raster, aber es ist mir nicht gelungen, dieses Plot mit dem vollen Raster zu erstellen.
Ich hoffe, diese Frage ist klar. Danke im Voraus.
Warum muss die Datei who; e im Speicher vorhanden sein? Kannst du die Datei in Stücke teilen? – DrBwts
Kennen Sie die untere und obere Grenze der Werte in der Datei? (Z. B. etwas wie "Außer -9999, alle Werte liegen zwischen -1000 und 1000.") –