75701


テーブル内でカラム間に依存のない処理を一定レコード数ごとにページ分割して  
parallel を使って並列にクエリを投げたいです

[code]

    max=$(psql -c 'select max(id) from tmp;' -A | sed -n 2P)
    
    for ((i=0; i < $max; i=end)); do
      start=$i
      end=$((start+100))
      query=$(cat << EOS
      INSERT ...
      SELECT ...
      WHERE id >= $start AND id < $end;
    EOS
      )
      echo $query
    #  time psql -c "$query"
    done
    
[/code]

とりあえず上のように逐次ループで分割自体はできたのですが  
これを & 付きで実行してしまうとタスクが作られ過ぎてしまうので  
同時実行数を制限しながら並列実行したいです

GNU parallel コマンドというのがあるらしく

[code]

    max=350
    seq 0 100 $max | parallel -j 100% echo $1
    
[/code]

とかいたら

[code]

    0
    100
    200
    300
    
[/code]

となったのでこれ自体は動きそうなんですが

$1 + 100 の値を bash でうまく生成できません

<https://qiita.com/b4b4r07/items/cb02bbfd6df58df06ea8>  
こちらを参考にして

> count=1  
>  count=$(expr $count + 1) # => 2

とあったので

[code]

    seq 0 100 $max | parallel -j 100% echo $(expr $1 + 100)
    
[/code]

とかいてみたところ

[code]

    100
    200
    300
    400
    
[/code]

となってほしいのが

[code]

    100 0
    100 100
    100 200
    100 300
    
[/code]

となぜか１行に２つ出力されてしまいます

最終的に元の for 文の do 〜 done の中身をそのままいれたいので  
ヒアドキュメントのなかに $1, $1+100 の値をうめこんだクエリを -c のなかにいれて実行したいです  
どうかけばいいのでしょうか

後者の方は最悪エスケープとかが大変になるなら別のファイルにまとめて

[code]

    seq 0 100 $max | parallel -j 100% task.sh $1 $(expr $1+100)
    
[/code]

のようにしてもいいと思ってるんですが分けずに書けるなら１ファイルにまとめてしまいたいです


CC BY-SA 4.0
2021-05-06T11:27:50.140
75700
2021-05-06T12:12:18.073
2021-05-06T11:35:00.237
question
bash
parallel で複雑なコマンドを実行したい

[code]

    seq 0 100 $max | parallel -j 100% 'echo $(({} + 100))'
    
[/code]

はいかがでしょうか？


CC BY-SA 4.0
2021-05-06T11:59:36.677
75701
2021-05-06T12:12:18.073
2021-05-06T12:12:18.073
35558
35558
75700
answer