2016-12-19 6 views
0

저는 파이썬에서 초보자입니다. 두 파일에서 두 개의 dict을로드 할 때 메모리 오류가 발생했습니다. 이 두 파일은 첫 번째 파일이 400메가바이트에 관한파이썬에서 큰 dict를로드하는 방법은 무엇입니까?

with open(filename, 'rb') as f: 
    hashtable_album = {} 
    for line in f: 
    # print i 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    # print a 
    # print type(a) 
    hashtable_album[itembuf] = a 
f.close() 
with open(filename2, 'rb') as f2: 
    hashtable_item={} 
    i=0 
    for line in f: 
    print len(dic) 
    print i 
    #print line 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    #print a 
    # print type(a) 
    hashtable_item[itembuf] = a 
    i=i+1 
f2.close() 

하고는 2백메가바이트에 관한 두 번째 다음 더 큰, 그리고 내가 메모리 오류가있어 두 번째 파일을로드 할 때 내가 첫 번째 파일 successfully.But을로드 할 수 있습니다 내가 두 번째 파일을로드 할 때

Traceback (most recent call last): 
    File "E:/py_workspace/1.0_memory_error.py", line 44, in <module> 
    hashtable_item[itembuf] = a 
    MemoryError 

내가 먼저 파일 2 읽고 따라이 file1의 파일을로드 할 순서를 변경하는 경우

으로, 또한 메모리 오류가 있습니다. 내가

hashtable_album = {} 

으로 파일 1로드로드 파일 2에 이동 한 후 메모리 오류 그래서 나는 DICT를 지우 DICT에서 오는 것 같아요. 그리고 이번에는 메모리 오류없이 작동합니다. 하지만이 두 개의 dicts를 동시에 사용해야합니다. 어떻게 그들을 함께로드 할 수 있습니까?

팁 : 나는 dick을 저장하기 위해 cPickle을 시도했지만 작동하지 않으며 메모리 오류도 발생합니다.

+0

** 동일한 스크립트 **의 데이터 컨테이너 및 비교기는 매우 나쁜 생각입니다! 여러분에게 중요한 데이터와 어딘가에 저장하지만'데이터베이스 시스템을 사용하지 않는 이유는 무엇입니까? '직접적으로'IO'는 항상 오류를 발생 시켰습니다 (하드웨어 성능 버그가 있음). "가상 OS"에서이 코드를 실행 했습니까? – dsgdfg

답변

0

아마도 32 비트 Python을 실행하고있을 것입니다. 32 비트 공간에서 실행 멀리 할 수없는 경우

다음 두 가지 옵션

  1. 가 C를 학습하고,에서 C.으로 처리를 수행하십시오

    $ python -c "import sys; print sys.maxint" // 64-bit python 
    9223372036854775807 
    
    $ python-32 -c "import sys; print sys.maxint" // 32-bit 
    2147483647 
    

    하여 해당 확인 파일의 크기를 입력하면 메모리 (mallocs/callocs)를 엄밀하게 사용하면 mem의 모든 내용을 저장할 수 있습니다.

  2. map-reduce를 허용하는 알고리즘의 경우 map-reduce를 배우고 각 단계에서 부분 파일 처리를 수행 한 다음 최종 단계에서 결과를 결합하는 것이 더 빠릅니다.
  3. 잘 모르겠지만 Cython을 사용해 볼 수도 있습니다.
+0

조언 해 주셔서 감사합니다. 나는 이것을 시도 할 것입니다. – Wenson

+0

32 비트 Python을 제거하고 64 비트 Python을 변경 한 다음 파이썬 파일을 다시로드합니다. 그것은 메모리 오류없이 작동합니다! 정말 고맙습니다 ! @Ajeet – Wenson

+0

당신은 오신 것을 환영합니다. :) 대답 @Wenson을 수락하는 것을 잊지 마십시오. 그런 식으로 다른 사람들은 그것이 효과가 있었다는 것을 알게 될 것입니다. –