2012-06-22 6 views
5

에 텍스트 파일 2GB의,이 같은 빠른 처리를 위해 메모리에 2.5GB의 텍스트 파일에서 모든 데이터를로드 할 때 :파이썬 부하 파이썬 2.7에서 메모리

>>> f = open('dump.xml','r') 
>>> dump = f.read() 

나는 다음과 같은 오류 있어요 :

Python(62813) malloc: *** mmap(size=140521659486208) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 

왜 파이썬은 2563749237 바이트 데이터에 140521659486208 바이트 메모리를 할당하려고 했습니까? 모든 바이트를로드하도록 코드를 수정하려면 어떻게합니까?

약 3GB RAM을 무료로 사용할 수 있습니다. 파일은 위키 낱말 사전 xml 덤프입니다.

+7

원본을 메모리에 먼저로드하지 않고 XML을 선형으로 구문 분석하지 않는 이유는 무엇입니까? – Alfe

+0

나는 그것을 시도하고 그것은 아주 오래 걸렸다. 그리고 많은 RAM을 가지고 있기 때문에 모든 것을 RAM에로드하여 속도를 높이고 싶습니다. – pckben

+0

램은 얼마입니까? 64 또는 32 비트? – joslinm

답변

10

mmap을 사용하면 전체 파일을 메모리에 즉시로드 할 수 있습니다.

import mmap 

with open('dump.xml', 'rb') as f: 
    # Size 0 will read the ENTIRE file into memory! 
    m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) #File is open read-only 

    # Proceed with your code here -- note the file is already in memory 
    # so "readine" here will be as fast as could be 
    data = m.readline() 
    while data: 
    # Do stuff 
    data = m.readline() 
+0

'mmap.error : [Errno 13] Permission denied'm = mmap.mmap (..)이있는 행에 대해 권한이 거부되었습니다. 어떻게 수정합니까? – pckben

+2

@pckben 파일이 읽기 전용 모드로 열려 있고 mmap은 읽기 - 쓰기를 매핑하려고합니다 :'prot = mmap.PROT_READ'를'mmap.mmap' 호출에 추가하면 괜찮을 것입니다. –

+1

차가움. 그것은 효과가있다! 무슨 일이 있었는지 설명해 주시겠습니까? – pckben

0

빠른 인터넷 검색 결과에 따르면, 내가 가진 것으로 보이는 문제를 해결하는 것으로 보이는 this forum post을 발견했습니다. 오류 코드를 기반으로 Mac 또는 Linux를 실행한다고 가정하면 포럼 게시판에 제안 된대로 gc.enable() 또는 gc.collect()으로 가비지 수집을 구현해보십시오.

+0

내 코드는 메모리에 데이터를로드하는 데 지정된 2 줄 밖에 없으므로 가비지 수집을위한 다른 살아있는 객체가 없습니다. – pckben