如何并行化 csh while loop parallel with GNU-parallel
How to parallelize csh while loop parallel with GNU-parallel
我有以下创建多个对象的脚本。
我只是简单地 运行 在我的终端中尝试了它,但它似乎花了很长时间。我怎样才能 运行 这与 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) * }'`
set y = `echo $ll_y $iy $del_y | awk '{print + ( - 1) * }'`
set txt = `echo $x $y $del_x $del_y | awk '{print , , , + , + , + , + , , , }'`
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
###
###
###
内部部分执行了 540,000 次,在每次迭代中您调用 3 awk
个进程来执行 3 个简单的数学运算...即 160 万次 awks。
除此之外,我编写了一个 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 模块用于操作 Shapefile here。我忍不住想那会快很多很多倍。
我有以下创建多个对象的脚本。
我只是简单地 运行 在我的终端中尝试了它,但它似乎花了很长时间。我怎样才能 运行 这与 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) * }'`
set y = `echo $ll_y $iy $del_y | awk '{print + ( - 1) * }'`
set txt = `echo $x $y $del_x $del_y | awk '{print , , , + , + , + , + , , , }'`
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
###
###
###
内部部分执行了 540,000 次,在每次迭代中您调用 3 awk
个进程来执行 3 个简单的数学运算...即 160 万次 awks。
除此之外,我编写了一个 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 模块用于操作 Shapefile here。我忍不住想那会快很多很多倍。