2011-07-06 6 views
2

거대한 탭으로 구분 된 파일이 있습니다. (10,000 개의 피검자는 줄로, 그리고 100 만 이상의 분석자는 란으로). 1 백만 개의 각 열과 관련된 정보가있는 매핑 파일이 있습니다. 필자는 모든 분석에 대해 (모든 셀에 대해) 매핑 파일을 조사하고 그 값을 얻고 기존 값을 대체해야합니다.병렬 처리가 가능합니까?

파이썬이나 펄에서는 모든 행을 읽고, 분할하고 각 셀을 매핑 파일에서 조회해야합니다.

R에서는 한 번에 각 열을 읽을 수 있으며 모든 행에 대해 매핑 파일에서 정보를 얻을 수 있습니다.

어느 쪽이든, 모든 행 또는 열을 반복하는 모든 과정은 모든 셀 검색이 완료 될 때까지 많은 시간이 소요됩니다.

내가 이것을 병렬화 할 수있는 방법이 있습니까 ?? 내가 이것을 병렬화하고 더 빨리 진행하고 싶다면 어떻게 생각해야합니까?

또한이 방법으로 맵/스타일을 줄이는 방법을 배우는 데 관심이 있습니까? 다음과 같이

샘플 데이터 파일은 다음과 같습니다 (탭 - 구분)

ID S1 S2 S3 S4 S5 
1 AA AB BA BB AB 
2 BA BB AB AA AA 
3 BA AB AB AB AB 
4 BA AB AB BB AA 
5 AA AB BA BB AB 
6 AA BB AB AA AA 

매핑 파일은 다음과 같습니다 : 데이터 파일에 따라서

SID Al_A Al_B  
S1 A  C 
S2 G  T 
S3 C  A 
S4 G  T 
S5 A  C 

, 모든 세포의 모든 A의, 그리고 B에서는 매핑 파일에서 A가 매핑되는 대상 (Al_A 열에서)과 B가 매핑되는 대상 (Al_B 열에서)을 확인하기 위해 조회가 수행되어야합니다.

+1

매핑 파일을 설명해 주시겠습니까? – ikegami

+1

작은 조각의 데이터 (몇 개의 행과 몇 개의 열, 분석 항목)와 스 니펫에 대한 관련 매핑 파일/데이터를 제공하여 이야기하는 것을 볼 수 있습니까? R은 벡터화되었으므로 각 열에 대해 병합 또는 인덱스 기반 바꾸기를 사용하여 병렬 방식으로 단일 열을 처리 할 수 ​​있습니다. –

+0

R에서는 별도의 코어에서 개별 열을 읽을 수 있습니다. 나는 이것이 실제로 어떤 속도를 제공 할 것인지 여부를 테스트하지 않고 판단 할 수 없습니다. –

답변

5

단순 병렬

parse.py 그것은 구문 분석 "열과 행 10,000 주제와> 1 만 분석"는 "분석"의 파일을 읽고 표준 출력에 데이터를 기록
python parse.py assays.txt | python lookup.py mapping.txt | python reformat.py >result.txt 

.

lookup.py는 "일부 값 얻기"매핑을 읽어 내부 사전을 채 웁니다. 그것은 stdin 데이터를 읽고, 조회를 수행하고 stdout에 결과를 씁니다.

reformat.py는 stdin을 읽고이를 다시 포맷하여 최종 보고서를 작성합니다.이 보고서는 입력 구조를 반영합니다.

이것은 "embarassingly"평행하지는 않지만, 작업을 약간 평행 한 병렬 단계로 나눕니다. 그것은 그러나, 문제의 쩔쩔 매게 병렬 성격을 반영 뭔가가, 놀라 울 정도로 강력한 그리고 당신은 아마 원하는 어떤 과정


떨어져 시간을 면도 할 수 있습니다. 10,000 * 1,000,000 = 100 억 개의 개인 가치가 있으며, 모두 완전히 독립적 인 것처럼 보입니다.

또 다른 (더 복잡한) 접근 방법이 있습니다. 그것은 http://docs.python.org/library/multiprocessing.html에 달려 있습니다.

  1. 간단한 리더 Process 파티션 NQueue의 상이한 레코드를 기록 입력 파일. 즉, 각 Queue은 10,000/n 개의 레코드를 가져옵니다.n은 10에서 100 사이의 큰 수입니다. 예. 100 개의 대기열 (각각 100 개의 레코드가 있음) 서버에있는 몇 개의 코어를 예약하기를 기다리는 것이 좋습니다. 코어는 100 % 사용 중입니다. 그건 좋은거야.

  2. NQueue들 각각은 각 레코드에 대한 분석 룩업 일을 수행하고 출력 Queue로 얻어진 기록두고 Process 작업자에 의해 서비스된다. 어떤 일이 발생하는지 알기 위해 다양한 값으로 n을 조정할 수 있습니다. 어떤 시점에서, 더 많은 수의 근로자가 일을 늦추게됩니다. 그 수준이 어디인지 예측하기는 어렵습니다. 그래서 실험하십시오.

  3. 출력 Queue은 작업자 Process이 읽고 대기열에서 찾은 것으로부터 출력 파일을 간단하게 형식화합니다.

이것은 당신이 파이썬에 입력 파일 및 대기열에서 직렬화 할 수 있습니다 "분석"개체의 어떤 종류를 필요로 의미

1

나는 당신의 데이터 셀의 각각 다른 독립적 인 문제를 알고있는 것처럼 , 이것을 감안할 때 이미 존재하는 코드를 변경하지 않고 이것을 병렬 처리하는 정말로 직접적인 방법이 있습니다. split 명령 줄 도구와 같은 명령을 사용하여 데이터 파일을 사전 처리하면됩니다. 그런 다음 기존 파일의 코드와 병행하여 각 파일을 처리하십시오. 마지막으로 고양이를 모두 뒤쪽으로 모으십시오. ,

split -l 100 data_file.tsv data_ 
ls data_* | xargs -L 1 perl your_processing_file.pl 
cat output_* > total_output 
rm output_* 
이 스크립트가 이름 data_의 $의 X의 파일을 출력 이름 OUTPUT_의 $ X의 새로운 파일을 생성한다고 가정

:

다음은 수행 할 수 있습니다 명령의 예입니다 당신은 그것을 약간 변경해야 할 수도 있습니다.

이것은 실제로 이와 같은 문제를 병렬 처리하는 매우 일반적인 방법입니다.

관련 문제