[GRASS-dev] R.terraflow on massive grids

Glynn Clements glynn at gclements.plus.com
Sat Aug 13 05:40:50 EDT 2011


Doug_Newcomb at fws.gov wrote:

> I have an fcell grid of elevations for the state of North Carolina (51000 
> rows 133000 columns 6783000000 cells) .  I tried to run r.terraflow in 
> GRASS7 ( 8/8/2011 svn snapshot) and ran into the dimension limits.  So I 
> patched them according to Glynn's email , 
> http://www.osgeo.org/pipermail/grass-user/2004-February/024722.html  and 
> tried again ( Would it be better to change the  dimension variable to int 
> instead of  short int?) .

I think that dimension_type has to be used consistently. There is a
class, "ijBaseType" which contains a pair of dimension_type members
(i.e. it's a coordinate pair), and there are also several classes
which derive from ijBaseType. If r.terraflow creates large arrays of
instances of ijBaseType or its subclasses, changing dimension_type to
32-bit could significantly increase memory consumption.

> This time my Streams file builds to about 26 GB and then r.terraflow bombs 
> with :
> 
> MFD flow direction
> D8CUT=999999986991104.000000
> Memory size: 808.00M (847249408) bytes
> Memory manager registering memory in MM_IGNORE_MEMORY_EXCEEDED mode.
> r.terraflow: grass2str.h:145: AMI_STREAM<T>*
> cell2stream(char*, elevation_type, long int*) [with T =
> float, elevation_type = float]: Assertion `nrows * ncols ==
> str->stream_len()' failed.
> 
> The memory size is interesting, because I'm giving it 8GB of RAM out of 16 
> GB in the command.  The temp directory has about 900GB of space, so it has 
> plenty of room .
> 
> The box is 64 bit Ubuntu 11.04 
>  
> related to ?
> 
> http://trac.osgeo.org/grass/ticket/1006

Yes. The total number of cells (nrows * ncols) is too large to fit
into an "int".

In general, rasters with more than 2^31-1 cells are problematic. 
Anything which counts cells risks running into similar problems.

In the case of r.terraflow, you may be able to fix this particular
issue by casting to "long" or "off_t" in the offending line, e.g.:

  assert((off_t) nrows * ncols == str->stream_len());

But there may be similar issues elsewhere in r.terraflow.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list