2017-05-26 1 views
0

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.

+0

Warum muss die Datei who; e im Speicher vorhanden sein? Kannst du die Datei in Stücke teilen? – DrBwts

+0

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.") –

Antwort

0

Mit 380 GB Einzelschwimmer haben Sie etwa 95 Milliarden Werte. Versuchen Sie nicht, die ECDF mit allen 95 Milliarden Werten zu plotten. Die meisten Plotting-Software kann nicht mit so vielen Punkten umgehen, und selbst wenn es möglich wäre, sind die meisten Displays nur ein paar tausend Pixel breit, so dass es keinen Sinn macht, Daten mit einer Auflösung aufzuzeichnen, die viel höher ist.

Berechnen Sie stattdessen ein Histogramm und arbeiten Sie in Stapeln. Wenn Sie bereits eine angemessene untere und obere Grenze für die Werte in der Datei kennen, können Sie die Histogramm-Bins vorab zuordnen. Andernfalls benötigen Sie möglicherweise einen Histogrammalgorithmus, der sich an die neuen Daten anpassen kann, die in jedem Batch ankommen.

Verwandte Themen