2017-02-01 6 views
0

배경 : 거대한 파일 .txt을 처리해야합니다. 그것은 data mining 프로젝트입니다. 그래서 나는 많은 .txt로 분할 한 각 하나 개 100MB 크기를 파일, 같은 디렉토리에 그들 모두를 구원하고 그들에게 이런 식으로 실행 관리 :파이썬 다중 처리 및 텍스트 파일 처리

from multiprocessing.dummy import Pool 과정에서

for filename in os.listdir(pathToFile): 
    if filename.endswith(".txt"): 
     process(filename) 
    else: 
     continue 

, 내가 파일을 구문 분석을 객체 목록에 추가 한 다음 다른 함수를 적용합니다. 전체 파일을있는 그대로 실행하는 것보다 SLOWER입니다. 그러나 충분히 큰 파일을 위해 나는 즉시 달릴 수 없을 것이고 나는 슬라이스해야 할 것이다. 그래서 나는 각 process(filename)이 끝날 때까지 기다릴 필요가 없으므로 실을 갖고 싶습니다.

어떻게 적용 할 수 있습니까? this을 확인했지만 코드에 적용하는 방법을 이해하지 못했습니다.

도움을 받으시기 바랍니다. 이 작업을 수행하는 방법은 here입니다. 내가 시도한 것 :

pool = Pool(6) 
for x in range(6): 
    futures.append(pool.apply_async(process, filename)) 

불행히도 나는 처음 6 개의 텍스트 파일만을 처리 할 것인가? 그렇지 않을 것인가? 어떻게 작동시킬 수 있습니까? 스레드가 끝나면 다른 파일 텍스트를 할당하고 실행을 시작합니다.

편집 :

for filename in os.listdir(pathToFile): 
    if filename.endswith(".txt"): 
     for x in range(6): 
      pool.apply_async(process(filename)) 
    else: 
     continue 
+0

루프의 모든 파일 이름을 전달하십시오. 6은 6 개의 파일이 동시에 처리됨을 의미합니다. 그러나 파이썬 길 (GIL)과 쓰레드 (thread) 때문에 속도를 높일 지 확신 할 수 없습니다. 대신 멀티 프로세싱을 고려해야합니다. –

+0

스레드 풀이나 프로세스 풀에 대해 이야기하고 있습니까? – roganjosh

+0

@roganjosh, 동일한 프로그램이므로 스레드 여야합니다. 그렇습니까? –

답변

2

첫째, 사용 multiprocessing.dummy 문제가를 처리 (CPU 집약적 인 작업 (파일을 읽을 때하는 주요 병목) 바인딩 IO 경우에만 당신에게 속도 증가를 줄 것이다 파일에 병목 현상이 있음) 도움이되지 않을 경우 "진짜"multiprocessing을 사용해야합니다. 이 파일 목록을 처리하기 위해 6 개 작업자 프로세스를 사용하고 반환 값의 목록을 반환합니다

from multiprocessing import Pool 
files = [f for f in os.listdir(pathToFile) if f.endswith(".txt")] 
pool = Pool(6) 
results = pool.map(process, files) 
pool.close() 

:

은 당신이 설명하는 문제는 Poolmap 기능 중 하나의 사용에 대한 더 적합한 것 같다 모든 파일이 처리 된 후 process() 함수의 현재 예제에서는 과 동일한 파일을 6 번 제출합니다.

+0

좋은, 간단한 대답. 결과에 접근하기 위해 풀을 close() 및 join()하지 않아도됩니까? – roganjosh

+0

파일 목록이 없습니다. 'for filename in os.list ... '를 사용하여 특정 폴더의 모든 .txt 파일에 접근합니다. –

+0

@roganjosh no,'map()'을 사용할 때'had()'을 사용하지 않아도됩니다. 왜냐하면 모든 작업자가 이미 작업을 완료했기 때문입니다. close()를 호출하면 작업자가 종료 할 수 있으므로 힌트는 좋은 연습입니다. – mata

관련 문제