2014-03-03 4 views
0

파일이 약 1.5GB이고 파이썬으로 pp (병렬 파이썬) 모듈을 사용하여 각 청크를 처리하기 위해 다중 처리를 사용할 수 있도록 파일을 청크로 나누고 싶습니다. 지금까지 나는 파이썬에서 f.seek를 사용했지만 바이트로 바이트를 증가시킬 수 있기 때문에 많은 시간이 걸린다. 대체 방법은 무엇 일 수 있는가? 파이썬의 mrjob (map-reduce 패키지)을 통해이 작업을 수행 할 수 있습니까?다중 처리를 위해 파일을 청크로 나누는 방법

샘플 코드 :이

def multi(i,slots,,file_name,date): 
f1=open(date+'/'+file_name,"rb") 
f1.seek(i*slots*69) 
data=f1.read(69) 
counter=0 
print 'process',i 
while counter<slots: 
    ##do some processing 
    counter+=1 
    data=f1.read(69) 

처럼 내가 뭐하는 거지 뭔가 내 각 행은 69 바이트를 tupple 데이터를 포함하고 멀티 기능은 N 시간 평행라고합니다 (여기서 n은 슬롯과 동일) 작업을 할

+0

1Gb 파일이 여러 개인 경우 각 스레드가 이러한 파일을 처리하도록 할 수 있습니다. 어쩌면이 파일들을 청크로 나눌 필요가 없을까요? –

+0

아니요 1 파일 만 처리해야하는 경우 청크로 나누어야합니다. –

+0

여러 파일이 있다는 사실은 사용자의 질문과 관련이 없습니다. "1GB 정도의 파일이 있습니다."등 –

답변

1

파일에 여러 개의 핸들을 열지 않는 이유는 무엇입니까? 그렇게하면 핸들 당 한 번만 '검색'할 필요가 있습니다.

f1 = open('file') 

f2 = open('file') 
f2.seek(100) # in practice the number would be <file size>/<no of threads> 

f3 = open('file') 
f3.seek(200) 
+0

나는 같은 방법을 사용하고 있지만 내가 언급했듯이, 다중 처리로 하나의 파일을 처리하는 데는 시간이 걸린다. 실제로 이것은 다중 처리로 약 40 초가 걸린다. 25 초 밖에 걸리지 않습니다. –

+4

여러 개의 I/O 채널을 포함하여 특수한 하드웨어 및 파일 시스템을 지원하지 않는 한 여러 스레드가 동일한 파일을 읽으려는 것이 일반적으로 성능 저하의 대책입니다. 파일이 하나의 I/O 채널 (일반적으로 많은 데스크탑에서 사용되는)이있는 컴퓨터에 연결된 하드 디스크에 있다면 한 스레드가 파일을 읽은 다음 다른 프로세스를 청크로 압축하는 것이 더 나을 것입니다. 다루다. 그리고 매 기회마다 최대한 많은 것을 기억하십시오. –

+0

그것은 많은 의미가 있습니다. –

1

가장 간단한 방법은 레코드를 읽고 반환하는 일반적인 기능입니다. 하지만 그 기능은 자물쇠로 보호됩니다. 아래와 같은 것. 필자는 파이썬 프로그래머가 아니므로 의사 코드를 해석해야합니다. 이제

f = open file 
l = new lock 

function read 
    acquire lock 
     read record 
    release lock 
    return record 

, 당신은 프로세서 코어가보다 더 이상 몇 스레드를 시작하지 않지만, 각각이 수행 : 모든 레코드에 대한 새 스레드를 시작하는 그래서 그 대신

while not end of file 
    record = read(); 
    process record 

을, 당신은 소수의 지속적인 스레드.

이렇게하는 또 다른 방법은 스레드를 읽기 전용으로 만드는 것입니다. 레코드를 읽고 스레드 안전 큐에 저장합니다. 대기열은 일부 크기 (100 개의 레코드, 10,000 개의 레코드 등)로 제한됩니다. 해당 큐에서 읽는 처리 스레드. 이 방법의 장점은 다른 스레드가 처리하는 동안 읽기 스레드가 큐를 채울 수 있다는 것입니다. 처리 스레드는 다음 레코드를 매우 빠르게 얻을 수 있습니다.

+0

모든 레코드가 아닌 모든 프로세스에 대해 파일이 열려 있지 않습니다. 그래서 5 개의 프로세스가 있으면 파일이 5 번 열립니다 당신의 방법은 좋지만 제 경우에는 처리하는 데 독서보다 훨씬 적은 시간이 걸립니다. 어쨌든 나는 독서를 평행 화해야합니다. –

+0

@AmanJagga : 사과드립니다. 나는 당신의 코드를 잘못 읽었다. 내 대답을 업데이트했습니다. –

+1

@AmanJagga : 독서를 병렬 처리 할 수 ​​없습니다. 디스크는 한 번에 한 가지만 할 수 있습니다. 처리가 읽기보다 시간이 많이 걸리는 경우, 프로그램은 I/O 경계이며 더 많은 스레드를 추가하면 도움이되지 않습니다. 당신이 할 수있는 최선의 방법은 하나의 읽기 스레드와 하나의 프로세싱 스레드가있어 읽기 시간 중 일부가 처리 시간과 겹치는 것입니다. –

관련 문제