【问题标题】:How to parallelize csh while loop parallel with GNU-parallel如何在与 GNU-parallel 并行的循环中并行化 csh
【发布时间】:2020-04-07 07:57:03
【问题描述】:

我有以下创建多个对象的脚本。

我尝试在终端中简单地运行它,但似乎需要很长时间。如何使用 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

###
###
###


【问题讨论】:

    标签: parallel-processing csh gnu-parallel


    【解决方案1】:

    内部部分被执行了 540,000 次,在每次迭代中,您调用 3 个awk 进程来执行 3 次简单的数学运算……这是 160 万次 awks。

    与此不同,我编写了一个 awk 来生成所有循环并进行所有数学运算,然后可以将其输入 bashcsh 以实际执行它。

    我写了这个并在原始版本达到 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
    

    如果输出看起来不错,您可以像这样通过bashcsh 运行它:

    ./MyAwk | csh
    

    请注意,我对这些 Shapefile (?) 工具、shpadddbfadd 工具一无所知。它们可能会或可能不会并行运行 - 如果它们类似于sqlite 并行运行它们不会对您有太大帮助。我猜上面的更改足以对您的运行时做出巨大的改进。如果没有,您可以考虑以下其他事项。

    • 您可以在以 dbfaddshpadd 开头的每一行附加一个与号 (&amp;),以便并行开始,然后在每 8 行之后打印一个 wait,以便运行8 个并行的块。

    • 您可以将脚本的输出直接输入 GNU Parallel,但我不知道行的顺序是否很关键。

    • 我认为这是在创建某种数据库。如果您在支持 RAM 的文件系统(例如 /tmp)上运行它可能会更快。

    • 我注意到有一个 Python 模块用于操作 Shapefile here。我不禁想到这会快很多很多倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多