2014-07-07 1 views
1

병렬화하려는 프로젝트에 mpi4py를 사용하고 있습니다. 다음은 내 프로그램에 대한 아주 기본적인 의사 코드는 다음과 같습니다sqlite (python)에 대한 MPI 잠금

Load list of data from sqlite database 
Based on COMM.Rank and Comm.Size, select chunk of data to process 

Process data... 

use MPI.Gather to pass all of the results back to root 

if root: 
    iterate through results and save to sqlite database 

단순히 각 프로세스가 데이터베이스에 자신의 결과를 기록함으로써 MPI.Gather에 대한 호출을 제거하고 싶습니다. 따라서 의사 코드를 다음과 같이 나타내겠습니다.

Load list of data 
Select chunk of data 
Process data 
Save results 

이렇게하면 프로그램 성능이 크게 향상됩니다. 그러나, 나는 이것을 성취하는 방법을 완전히 모르고있다. Google을 통해 메소드를 찾으려고했지만 MPI-IO 만 찾을 수있었습니다. MPI-IO를 사용하여 데이터베이스에 쓸 수 있습니까? 특히 python, sqlite 및 mpi4py를 사용합니다. 그렇지 않다면 sqlite 데이터베이스에 동시에 쓰는 다른 방법이 있습니까?

편집 :

@CL 코멘트에서 지적

, sqlite3를 데이터베이스에 대한 동시 쓰기를 지원하지 않습니다. 그럼 내 질문을 조금 다르게 해보 자. 데이터베이스 쓰기를 잠그고 쓰기 전에 잠금이 제거 될 때까지 다른 프로세스가 대기 할 수있는 방법이 있습니까? sqlite3 자체 잠금 모드를 알고 있지만 이러한 모드는 삽입 대신 블록 실패 할 것으로 보인다. 나는 파이썬 스레딩에서 이와 비슷한 것을 보았지만 MPI로 이것을 수행하는 것에 대해 온라인으로 아무것도 찾을 수 없었다.

+0

[FAQ] (http://www.sqlite.org/faq.html#q5)를 참조하십시오. –

+0

감사합니다.이 절에서는 여러 프로세스가 같은 시간에 데이터베이스에 쓸 수 없다는 것을 아주 명확하게 설명합니다. 그러나 MPI는 프로세스가 선착순으로 데이터베이스에 차례로 쓰는 효율적인 방법을 가지고 있습니까? 이렇게하면 내 프로그램에서 Gather를 사용할 필요가 없어지고 처리가 끝난 프로세스가 느린 프로세스를 기다리지 않고 데이터를 쓸 수있게됩니다. – Harrison

답변

1

결과를 루트 프로세스로 다시 전달하고 루트 프로세스가 SQLite 데이터베이스에 결과를 기록하도록 제안합니다. 의사 코드는 다음과 같이 보일 것입니다 :

load list of data 
if rank == 0: 
    for _ in len(data): 
     result = receive from any worker 
     save result 
else: 
    select chunk of data 
    process data 
    send result(s) to rank 0 

수집보다 이점은 순위 0은 준비가되면 즉시 결과를 저장할 수 있다는 것입니다. an mpi4py example은 많은 작업이 있고 처리 시간이 매우 다양 할 때 여러 작업자에게 작업을 분산시키는 방법을 보여줍니다.

+0

답변 주셔서 감사합니다.하지만 질문에서 알 수 있듯이 원래의 방식은 데이터를 루트 프로세스로 다시 전달하는 것입니다. 질문에서 나는 각 프로세스가 동시에 데이터베이스에 기록되도록함으로써이를 피할 수있는 방법이 있는지 알고 싶었습니다. – Harrison

+0

@Harrison, 당신은 물었습니다. "MPI는 프로세스가 선착순으로 데이터베이스에 차례로 쓰는 것을 허용하는 효율적인 방법을 가지고 있습니까?" 그 방법은 루트 프로세스가 데이터베이스에 대한 쓰기를 조정하도록하는 것입니다. 어떤 종업원이라도 받음으로써 선착순으로 선착순으로 선발됩니다. 유일한 단점은 루트 프로세스가 유휴 상태 일 것이지만 보상을 위해 추가 작업자 프로세스를 할당 할 수 있다는 것입니다. –