2013-06-30 5 views
1

Mojo :: Command로 구현 된 스크립트가 있습니다. 거대한 텍스트 파일을 읽고 거기에서 데이터를 추출합니다. 이 파일에는 간단한 탭 구분 (C/TSV) 레코드가 들어 있습니다. 한 줄에 한 레코드. 모조 이벤트 루프를 사용하여 레코드를 작은 파일, 즉 레코드 당 하나의 파일에 저장하면 어떻게됩니까? 내 스크립트는 각 레코드가 저장 될 때까지 기다리지 않고 다음 레코드까지 계속됩니다.거대한 텍스트 파일을 처리하는 장기 실행 스크립트에 Mojo Event Loop 사용?

package My::task; 
use Mojo::Base 'Mojolicious::Command'; 
#in My::task::run 
#use Text::CSV to open and read the file 
while (!$csv->eof()) { 
    my $row = $csv->getline($fh) 
    do_something_time_consuming_and_store_the_record_somewhere($row) 
} 

나는 모조 이벤트 루프를 사용하고 포크 (fork)/스레딩을 방지 할 수있다 생각했다 : 여기

는 벗었 예이다. 성공적으로 이전에 Parallel::Forker을 사용했지만 Mojo가 실행 속도를 높이기 위해 무엇을 제공해야하는지 생각했습니다. 그게 가능합니까? 방법?

답변

0

do_something_time_consuming의 성격에 따라 다릅니다. 프로세스가 CPU 사용량이 많은 경우, 이벤트 루프가 제공하지 않는 병렬 처리를 찾고 있습니다. 이 경우에는 각 행을 redis (mojo :: redis를 통해)로 보내고 작업자 프로세스가 각 레코드를 사용, 처리, 저장하도록 할 수 있습니다. 그러면 처리량은 실행할 수있는 병렬 작업자 수만큼 줄어 듭니다.

반면에 do_something_time_consuming이 많은 대기 (예 : 웹 서비스에 게시 및 결과 기다리기)를 포함하면 이벤트 루프 (mojo 포함)가 큰 효과를 얻을 수 있으며 원하는 동시성을 처리 할 수 ​​있습니다. 당신이 세부적으로 짧기 때문에 비 차단 UserAgent 예제가 시나리오에 가장 가까운 것을 추측하기는 어렵습니다. 요점은 원격 서비스에서 응답을 받으면 원하는 것을 수행하는 콜백을 만드는 것입니다 (예 : store_the_record_somewhere).

+0

do_something ... ($ 행)은 복잡합니다. :) 레코드에서 무엇이 발견되는지에 따라 mysql 데이터베이스에 연결되거나 연결되지 않을 수도 있습니다. 그것은 또한 자기 자신 등등 기록에서 추측에 CPU 집약적 일 수 있습니다. 이것이 내가 그것을 추상화 한 이유입니다. 그러나 아마도 적어도 IO 부분이 레코드를 저장/덤프 할 때까지 기다리지 않고 mysql이 응답하기를 기다리지 않고 어떻게 진행해야합니까? –

+0

나는 또한 hypnotoad를 사용하여 서버 및 클라이언트 측 파트에서 명령을 분할하려고 생각했습니다 ... 물론 잘 모르겠습니다.) ... –

+0

그래서 조합이 있습니다. o) 많이 사용하고 있습니다. DBD :: mysql을 통해 비동기 호출이있는 IOLoop. 그러나 당신이 조합을 가지고 있기 때문에, 당신은 정말로 mojo :: redis와 resque 노동자의 군대와 함께 가고 싶습니다. (#mojo에 diegok 우리의 거주 전문가입니다) – niczero