Есть очень простая методика:
- 1) Исходная область делится на подобласти, т.е. создается несколько наборов с разным географическим охватом (с частичным нахлестом).
2) В каждом наборе запускается в фоновом режиме необходимый скрипт.
3) Из частных результатов в исходной области собирается окончательный результат.
Здесь описывается процесс параллельного запуска скрипта в нескольких наборах. В качестве примера будем использовать область spearfish60, в котором уже есть два набора: PERMANENT и user1 (в действительности охваты этих наборов почти одинаковые, но в данном случае для наших целей это не важно).
Предположим, что у нас имеется скрипт, который требующий сложных и долгих вычислений. В качестве примера возьмем скрипт состоящий из одной команды:
Спойлер
Код: Выделить всё
#!/bin/bash
g.region res=1
r.resample in=elevation.10m out=tmp --o --q
g.region res=100
По аналогии с этим примером создем скрипт - обертку. Будем передавать этому скрипту три параметра (пути к БД GRASS, Location и Mapset). Этот скрипт будет инициализировать соответствующие переменные окружения и запускать на выполнение скрипт scr.sh:
Спойлер
Код: Выделить всё
#!/bin/bash
# Скрипт-обертка над scr.sh
# Аргументы, передаваемые, скрипту:
# $1 -- Путь к БД
# $2 -- Название области
# $3 -- Название набора
if [ $# -ne 3 ]
then
echo 'Нужно передать три аргумента:
$1 -- Путь к БД
$2 -- Название области
$3 -- Название набора
'
exit 1
fi
THE_GISDBASE="$1"
THE_LOCATION="$2"
THE_MAPSET="$3"
# Настройка параметров перед запуском GRASS
GISBASE=/usr/lib/grass64
export GISBASE
PATH=$PATH:$GISBASE/bin:$GISBASE/scripts
export PATH
if [ -z "$LD_LIBRARY_PATH" ]
then
LD_LIBRARY_PATH=$GISBASE/lib
else
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GISBASE/lib
fi
export LD_LIBRARY_PATH
GIS_LOCK=$$
THE_GRASSRC="/tmp/grassrc.$$"
echo "GISDBASE: $THE_GISDBASE
LOCATION_NAME: $THE_LOCATION
MAPSET: $THE_MAPSET
" > "$THE_GRASSRC"
export GISRC="$THE_GRASSRC"
# Вызываем скрипт GRASS
./scr.sh
# Удаляем файл с настройками, чтобы не мусорить в системе:
rm "$THE_GRASSRC"
Спойлер
Код: Выделить всё
#!/bin/bash
./grass_external_script.sh ~/laboro/GRASSDATA spearfish60 PERMANENT &
./grass_external_script.sh ~/laboro/GRASSDATA spearfish60 user1 &
Спойлер
Tasks: 213 total, 4 running, 207 sleeping, 1 stopped, 1 zombie
Cpu(s): 55.4%us, 5.6%sy, 0.0%ni, 39.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3798960k total, 3617352k used, 181608k free, 316368k buffers
Swap: 4000116k total, 0k used, 4000116k free, 1002616k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4849 dima 20 0 25256 2448 1220 R 100 0.1 0:10.95 r.resample
4848 dima 20 0 25252 2448 1220 R 100 0.1 0:10.96 r.resample
...
Cpu(s): 55.4%us, 5.6%sy, 0.0%ni, 39.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3798960k total, 3617352k used, 181608k free, 316368k buffers
Swap: 4000116k total, 0k used, 4000116k free, 1002616k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4849 dima 20 0 25256 2448 1220 R 100 0.1 0:10.95 r.resample
4848 dima 20 0 25252 2448 1220 R 100 0.1 0:10.96 r.resample
...