[GRASS-user] multiprocessing in python
Moritz Lennert
mlennert at club.worldonline.be
Tue Feb 6 05:47:53 PST 2018
On 06/02/18 12:09, Leonardo Hardtke wrote:
> Dear all,
> I am working on a module to extract the phenological parameters (like
> timesat) from a time series implemented in python/cython and making use
> of gscript and other grass stuff.
> It works great on a 256x256 and as the plan is applying it over
> Australia at 250m over 17 years, I need to split the process in small
> tiles. The idea is to run this processes in parallel and I am having
> issues implementing it.
>
> This would be the first part of the process that runs on each tile:
>
> def tile_process(tile_index):
> '''
> Function for every worker:
> Applies any function to the sub_region corresponding to the tile_index.
> '''
> global Rows
> global Cols
> global RowBlockSize
> global ColBlockSize
> global full_region
> global dates
> global years
> global indices
> global data_serie
> global yr_limits_extra
> global yr_limits
> global dbif
>
> sub_name='block'
> TileRow, TileCol, sr =
> sub_region(tile_index,full_region,RowBlockSize,ColBlockSize)
> # # Define a temporary region based on the parameters caluculated
> with the
> start_row = TileRow * RowBlockSize
> start_col = TileCol * ColBlockSize
> n_rows = sr['rows']
> n_cols = sr['cols']
>
> strds = tgis.SpaceTimeRasterDataset(data_serie)
> strds.select(dbif=dbif)
> maps = strds.get_registered_maps_as_objects(dbif=dbif)
>
> # Numer of time steps
> steps = len(maps)
> # Make an empty array
> #print(steps)
> EVI = np.empty([steps,n_rows,n_cols])
> # fill the array
> for step, map in enumerate(maps):
> map.select(dbif=dbif)
> image_name = map.get_name()+'@'+data_serie.split('@')[1]
> #print("reading: {}".format(image_name))
> EVI[step,:] =
> raster2numpy_sub(image_name,start_row,n_rows,start_col,n_cols)
> mean = EVI.mean()
> print(mean)
> ....
> ....
> ....
>
>
> and this is how I start the multiprocess pool.
>
> pool.map(tile_process, xrange(RowBlockN*ColBlockN))
> pool.close()
> pool.join()
>
> and it gives me:
>
> AssertionError: can only test a child process
>
>
> of course if I do: tile_process(0) or tile_process(1) etc ,the right
> result comes out.
>
> Does any of you have experience with this? Any suggestion would be welcome!
> Sorry for the messy code. Is still in early stage.
Just a wild guess: have you tried with range (which returns a list)
instead of xrange (which returns an xrange object) ?
Moritz
More information about the grass-user
mailing list