Как распараллелить csh при l oop параллельно с GNU-параллельным - PullRequest
1 голос
/ 07 апреля 2020

У меня есть следующий скрипт, который создает несколько объектов.

Я попытался просто запустить его в своем терминале, но, похоже, это заняло так много времени. Как я могу запустить это с GNU-параллелью?

Сценарий ниже создает объект. Он проходит от niy = 1 до niy = 800, и для каждого приращения в niy он проходит от njx = 1 до 675.

#!/bin/csh


set njx = 675 ### Number of grids in X
set niy = 800  ### Number of grids in Y
set ll_x = -337500 
set ll_y = -400000 ### (63 / 2) * 1000 ### This is the coordinate at lower right corner
set del_x = 1000
set del_y = 1000

rm -f out.shp
rm -f out.shx
rm -f out.dbf
rm -f out.prj


shpcreate out polygon    
dbfcreate out -n ID1 10 0 



@ n = 0 ### initilzation of counter (n) to count gridd cells in loop
@ iy = 1  ### initialization of conunter (iy) to count grid cells along north-south direction

echo ### emptly line on screen

while ($iy <= $niy)  ### start the loop for norht-south direction
   echo ' south-north'   $iy '/' $niy ### print a notication on screen

   @ jx = 1 
   while ($jx <= $njx)### start the loop for east-west direction 
      @ n++ 


      set x = `echo $ll_x $jx $del_x | awk '{print $1 + ($2 - 1) * $3}'`
      set y = `echo $ll_y $iy $del_y | awk '{print $1 + ($2 - 1) * $3}'`
      set txt = `echo $x $y $del_x $del_y | awk '{print $1, $2, $1, $2 + $4, $1 + $3, $2 + $4, $1 + $3, $2, $1, $2}'`

      shpadd out `echo $txt`
      dbfadd out $n

      @ jx++
   end ### close the second loop

   @ iy++
end ### close the first loop

echo 



### lines below create a projection file for the created shapefile using

cat > out.prj  << eof
PROJCS["Asia_Lambert_Conformal_Conic",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",120.98],PARAMETER["Standard_Parallel_1",5.0],PARAMETER["Standard_Parallel_2",20.0],PARAMETER["Latitude_Of_Origin",14.59998],UNIT["Meter",1.0]]
eof

###
###
###


1 Ответ

3 голосов
/ 07 апреля 2020

Внутренняя часть выполняется 540 000 раз, и на каждой итерации вы вызываете 3 awk процессов для выполнения 3 простых битов математики ... это 1,6 миллиона ауков.

Вместо этого я написал один awk, чтобы сгенерировать все циклы и выполнить все математические операции, и это затем может быть передано в bash или csh для его фактического выполнения. дошло до 16%. Я не проверил это очень тщательно, но вы должны быть в состоянии легко исправить любые незначительные ошибки:

#!/bin/bash

awk -v njx=675 -v niy=800 -v ll_x=-337500 -v ll_y=-400000 '
   BEGIN{
      print "shpcreate out polygon"
      print "dbfcreate out -n ID1 10 0"
      n=0

      for(iy=1;iy<niy;iy++){
         for(jx=1;jx<njx;jx++){
            n++
            x = llx + (jx-1)*1000
            y = lly + (iy-1)*1000
            txt = sprintf("%d %d %d %d %d %d %d %d %d %d",x,y,x, y+dely, x+delx, y+dely, x+delx,y,x,y)
            print "shpadd out",txt
            print "dbfadd out",n
         }
      }
   }' /dev/null

Если вывод выглядит хорошо, вы можете затем запустить его через bash или csh следующим образом :

./MyAwk | csh

Обратите внимание, что я ничего не знаю об этих инструментах Shapefile (?), shpadd или dbfadd. Они могут или не могут быть запущены параллельно - если это что-то вроде sqlite, то параллельное их выполнение не очень вам поможет. Я полагаю, что приведенных выше изменений достаточно, чтобы значительно улучшить вашу среду выполнения. Если нет, вот некоторые другие вещи, о которых вы могли бы подумать.

  • Вы можете добавить амперсанд (&) к каждой строке, которая начинается с dbfadd или shpadd, чтобы несколько начните параллельно, а затем печатайте wait после каждых 8 строк, чтобы вы выполняли 8 параллельных кусков.

  • Вы можете передать вывод сценария непосредственно в GNU Parallel , но я понятия не имею, является ли порядок строк критическим.

  • Я предполагаю, что это создает какую-то базу данных. Это может быть быстрее, если вы запустите его в файловой системе с поддержкой RAM, такой как /tmp.

  • Я заметил, что есть модуль Python для манипулирования Шейп-файлы здесь . Я не могу не думать, что это будет намного, во много раз быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...