将数组传递给GNU Parallel以替换循环

时间:2018-06-19 15:46:19

标签: bash parallel-processing netcdf gnu-parallel

a)我想并行运行2个脚本

b)我想在这些脚本中并行进行for循环。

在获得此代码之前:

for year in 2000 2001 2002 2003; do

  echo $year" LST data being merged"

  cd $base_data_dir/$year

  # this is the part that takes a long time
  cdo -f nc2 mergetime *.nc $output_dir/LST_$year.nc

done

我想使用GNU Parallel尝试并行运行。

我尝试了以下方法:

a)创建一个调用其他脚本的“控制器”脚本

b)传入数组作为GNU并行的参数

控制器脚本

# 1. Create monthly LST for each year

cd $working_dir
seq 2000 2003 | parallel 'bash create_yearly_LST_files.sh {}'

# 2. Create monthly NDVI for each year

cd $working_dir
seq 2000 2003 | parallel 'bash create_yearly_NDVI_files.sh {}'

这应该并行运行以下内容:

bash create_yearly_LST_files.sh 2000
bash create_yearly_LST_files.sh 2001
...

bash create_yearly_NDVI_files.sh 2000
bash create_yearly_NDVI_files.sh 2001
...

处理脚本(与NDVI相同)

year="$1"
echo $year" LST data being merged"
cd $base_data_dir/$year

cdo -f nc2 mergetime *.nc $output_dir/LST_$year.nc

因此命令应显示为:

cd $base_data_dir/2000
cdo -f nc2 mergetime *.nc $output_dir/LST_2000.nc

cd $base_data_dir/2001
cdo -f nc2 mergetime *.nc $output_dir/LST_2001.nc
...

cd $base_data_dir/2000
cdo -f nc2 mergetime *.nc $output_dir/NDVI_2000.nc

cd $base_data_dir/2001
cdo -f nc2 mergetime *.nc $output_dir/NDVI_2001.nc
...

我的问题:

这些过程仍然可以在我的新代码中运行,但是性能没有提高。

有人可以帮助我了解每年如何并行运行吗?

并同时并行运行两个脚本(create_yearly_LST_files.shcreate_yearly_NDVI_files.sh

3 个答案:

答案 0 :(得分:2)

阻止您执行操作的原因

for year in 2000 2001 2002 2003; do

  echo $year" LST data being merged"

  cd $base_data_dir/$year

  # this is the part that takes a long time
  cdo -f nc2 mergetime *.nc $output_dir/LST_$year.nc &

done
wait

答案 1 :(得分:2)

使用 GNU Parallel

cd $working_dir
parallel 'cd {}; cdo -f nc2 mergetime *.nc xxx/LST_{}.nc' ::: {2000..2003}

答案 2 :(得分:1)

也许这会起作用:

{{1}}