[Python] gestione della memoria
Lorenzo Bottai
bottai a lamma.rete.toscana.it
Mer 6 Giu 2012 14:44:44 CEST
Potrei postare il piccolo programma che gira solo con immagini piu' piccole e si blocca con matrici grandi, in modo che possiate vedere direttamente. Ovviamente utilizzo numpy e per la verità la definizione di matrici anche di grandi dimensioni non genera problemi il blocco avviene quando si richiama gdal e le altre.
questo è il programmino:
-----------------------------------------------------------------------------------------------------------------------------------------------------
import skimage.graph as graph
from skimage import filter
from skimage.morphology import watershed, is_local_maximum
from scipy import ndimage
import os, numpy, sys, time,math,csv
from osgeo import gdal, ogr
from osgeo.gdalconst import *
from math import *
from gdalconst import *
startTime = time.time()
os.chdir(r'c:\Users\lorenzo\lidar2')
gdal.AllRegister()
# open the image
inDs1 = gdal.Open('conv_utm2m.tif',GA_ReadOnly)
print 'legge immagine di convergenza'
# get image size
rows = inDs1.RasterYSize
cols = inDs1.RasterXSize
bands = inDs1.RasterCount
transform = inDs1.GetGeoTransform()
driver = gdal.GetDriverByName('GTiff')
outDs1 = driver.Create('conv_massimo.tif', cols, rows, 1, GDT_Int32)
outDs2 = driver.Create('conv_chiome.tif', cols, rows, 1, GDT_Int32)
print 'righe', rows, 'colonne', cols, 'bande', bands
driver1 = inDs1.GetDriver()
convergenza = numpy.ones((rows,cols),numpy.float)
massimi =numpy.zeros((rows,cols),numpy.int)
chiome = numpy.zeros((rows,cols),numpy.float)
inBand1 = inDs1.GetRasterBand(1)
print 'leggo convergenza'
convergenza = inBand1.ReadAsArray(0,0,cols,rows).astype(numpy.float)
print ' fatto ..'
print ' ----- calcolo con algoritmo watershed -------'
print ' cerco il massimo locale sulla convergenza'
massimi = is_local_maximum(convergenza)
print ' numero in modo progressimo i massimi'
markers = ndimage.label(massimi)[0]
print ' allago le pozze i bacini........'
chiome = watershed(-convergenza, markers)
print 'lette tutte le righe'
outBand1 = outDs1.GetRasterBand(1)
outBand2 = outDs2.GetRasterBand(1)
# write the data
outBand1.WriteArray(massimi, 0, 0)
outBand1.FlushCache()
stats1 = outBand1.GetStatistics(0, 1)
outBand2.WriteArray(chiome, 0, 0)
outBand2.FlushCache()
stats2 = outBand2.GetStatistics(0, 1)
outDs1.SetGeoTransform(transform)
outDs2.SetGeoTransform(transform)
outDs1 = None
outDs2 = None
inDs1 = None
print 'script took', time.time() - startTime, 'seconds to run'
----- Messaggio originale -----
Da: "Fabrizio Mancini" <mr.file a gmail.com>
A: "Discussioni generali sul linguaggio Python" <python a lists.python.it>
Inviato: Mercoledì, 6 giugno 2012 14:15:04
Oggetto: Re: [Python] gestione della memoria
scusa forse per l'ovvietà, ma hai già provato a dare uno sguardo a numpy?
http://numpy.scipy.org/
Ciao Fabrizio
_______________________________________________
Python mailing list
Python a lists.python.it
http://lists.python.it/mailman/listinfo/python
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120606/c2e94198/attachment.html>
Maggiori informazioni sulla lista
Python