2012-07-13 2 views
0

내 프로젝트에서 큰 파일 (~ 250GB)을 원격 서버에 업로드 한 다음 스크립트를 실행하여 파일을 mysql에로드해야합니다. 문제는 단일 파일을로드하는 데 시간이 너무 오래 걸리는 것입니다. 그래서 파일을 작은 트렁크로 분할하고 여러 터미널에서 동시에 10-20 개의 프로세스를 실행해야합니다. 나는 각 파일 ~ 2MB의 분할 경우 나, 각 터미널에수천 개의 다른 인수로 실행해야하는 명령 자동화

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

처럼 실행 끝에 그들을 기다린 다음을 실행해야 operation.Then, 그것은 나에게 10 시간이 소요됩니다.

이 프로세스를 자동화 할 수있는 방법이 있습니까? 이전 쉘이 완료되면 작업을 계속할 수있는 쉘 스크립트? 감사합니다. 쉘에서

답변

0

당신은 시도 할 수 있습니다 :

가 이전 한 다음과 같은 한 줄과 같이 쓸 수있다
for i in *.csv 
do 
    ruby importer.rb $i.csv 
done 

:

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*.csv, b*.csv, [ab]*.*csv 등)을 재생할 수 있습니다, 또는 당신은 다른 루프를 시도 할 수 있습니다 : echo {a..q}Q에서 문자의 시퀀스를 생성

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

을 파일 이름을 따르는 것 같습니다. 마지막 예제의 키는 &이며 백그라운드에서 프로세스를 종료합니다. 마지막 예제에서는 17 개 프로세스가 동시에 실행됩니다. 동시에 원하지 않으면 앰퍼샌드를 제거해야합니다. &.

관련 문제