0

私のプロジェクトでは、大きなファイル (~250GB) をリモート サーバーにアップロードし、スクリプトを実行してそのファイルを mysql にロードする必要があります。問題は、単一のファイルをロードすると時間がかかりすぎることです。そのため、ファイルを小さなトランクに分割し、複数のターミナルで 10 ~ 20 のプロセスを同時に実行する必要があります。各ファイルを最大2MBに分割すると、100,000回の操作が必要になります.次に、次のように実行する必要があります

ruby importer.rb data_part01_aa.csv
ruby importer.rb data_part01_ab.csv
ruby importer.rb data_part01_ac.csv
.
.
.

各ターミナルで、それらが終了するのを待ってから、次を実行します。

このプロセスを自動化できる方法はありますか? 前のジョブが終了したときにジョブを続行できるシェル スクリプトはありますか? どうもありがとう!

4

1 に答える 1

0

シェルで試すことができます:

for i in *.csv
do
    ruby importer.rb $i.csv
done

前のものは、次のように 1 行で記述できます。

for i in *.csv; do ruby importer.rb data_part01_aa.csv; done

引数が多すぎると、最終的に実行を開始するのに時間がかかることがあります。そのような場合は、次の方法で試すことができますfind

find . -name '*.csv' -exec ruby importer.rb {} \;

ただし、前のコマンドはすべてのサブディレクトリを再帰的に検索します。現在のディレクトリに対してのみ実行するには、次を実行する必要があります。

find . -maxdepth 1 -name '*.csv' -exec ruby importer.rb {} \;

与えられたすべての例で、コマンドは順番に実行されます。代わりに*.csv、さまざまなパターン (つまりa*.csvb*.csv[ab]*.*csvなど) で遊ぶか、別のループを試すことができます。

for j in $(echo {a..q})
do
    find . -name "data_part01_$j?.csv" -exec ruby importer.rb {} \; &
done

Whereは、 aからqecho {a..q}までの一連の文字を生成します。これは、ファイルの名前に従っているようです。最後の例のキーは&で、プロセスをバックグラウンドのままにします。最後の例では、17 個のプロセスが同時に実行されます。それらを同時にしたくない場合は、アンパサンド&を削除するだけです。

于 2012-07-13T03:01:13.523 に答える