[gdal-dev] Raster size and ReadAsArray()
Even Rouault
even.rouault at mines-paris.org
Wed Aug 3 13:32:29 EDT 2011
Le mercredi 03 août 2011 15:35:22, Alexander Bruy a écrit :
> Hi,
>
> There is a well-know "problem": reading really large rasters or bands
> into memory with DataSource.ReadAsArray() method impossible due
> memory limitations. For example, when I try to read one band with
> size 53109x29049 I get error:
>
> File "C:\OSGeo4W\apps\Python25\lib\site-packages\osgeo\gdal.py", line
> 727, in ReadAsArray
> return gdalnumeric.DatasetReadAsArray( self, xoff, yoff, xsize,
> ysize, buf_obj )
> File "C:\OSGeo4W\apps\Python25\lib\site-packages\osgeo\gdal_array.py",
> line 162, in DatasetReadAsArray
> return BandReadAsArray( ds.GetRasterBand(1), xoff, yoff, xsize,
> ysize, buf_obj = buf_obj)
> File "C:\OSGeo4W\apps\Python25\lib\site-packages\osgeo\gdal_array.py",
> line 228, in BandReadAsArray
> ar = numpy.empty([buf_ysize,buf_xsize], dtype = typecode)
> ValueError: dimensions too large.
>
> I want to know is it possible to get maximum raster size that can be
> handled using ReadAsArray() without errors because I want to implement a
> fallback algorithm for large rasters in my tool.
It is difficult to predict in all cases. But there are a few things to keep in
mind. Do you use a 32 bit build of GDAL or a 64 bit one ? If it is a 32 bit,
then your memory allocations are generally limited to 2 GB by process, and
much of the time even less because it is difficult to get reliably a continuous
area of virtual memory of such a size. 53109 x 29049 = 1.5 GB if your data is
of type Byte and if your dataset has only one band (multiply by the number of
bands and the size in byte of the band data type). With a 64 bit build of GDAL
and enough RAM, that should work more reliably.
>
> Currently I try to implement it with try-except statement but maybe
> there is more
> elegant solution?
Yes, work with smaller buffers...
>
>
> Thanks
More information about the gdal-dev
mailing list