2013-10-30 2 views
0

현재 줄에서 한 줄씩 사전에서 csv 파일에 쓰고 있습니다. 이처럼 : 내 사전에 큰 얻는다 (예를 들어 20 ~ MB) 그리고 나는 내 리눅스 머신에 힙 공간의 제약을 오전 :python 사전에서 파일로 쓰기

writer = csv.writer(open(filename, 'a')) 
    for key, value in mydict.items(): 
     writer.writerow([key, value]) 

내 문제는 이것이다. 따라서 필자는 쓰기 전에 사전에 모든 데이터를 누적하는 대신 사전에 데이터를 사용할 수있게되면 즉각 csv 파일에 데이터를 쓰는 방법을 사용했습니다.

지금, 또 다른 문제가 있습니다. 많은 수의 IO 작업 (수천 줄의 디스크에 기록됨)으로 인해 프로그램이 매우 느리게 실행됩니다.

나는 중견을 찾아야합니다. 아마도, 5000 (k, v) 데이터를 사전에 쌓아서 디스크에 쓰고 내 사전을 비우고 다음 5000 (k, v) 쌍을 기다리십시오 ...이 과정을 계속하십시오. 다른 아이디어가 있습니까?

간단히 말해 파일에 일괄 적으로 쓰는 것이 좋습니까?

감사합니다,

+0

20 MB에서 메모리 문제가 발생합니까? 임베디드 시스템에서 실행하고 있습니까? – Hyperboreus

+0

매우 힘든 시스템에 있지 않는 한 5000 개의 쓰기 및 20MB의 데이터가 빠르다. 프로그램에서 느린 다른 것이 있습니까?/dev/null에 쓰기를 시도하십시오. 속도가 느리다면 문제가되는 파일을 쓰지 않습니다. – tdelaney

+0

당신의 아이디어는 매우 간단하게 들립니다. 실제로 사전을 쓰고 지우는 코드 앞에'if len (mydict)> = BATCH_SIZE :'를 추가하는 것입니다. 끝 부분에 마지막 부분 배치를 작성하는 것을 잊지 마십시오. 버퍼링 된 CSV 래퍼를 사용하여 더욱 쉽게 만들 수 있습니까? – abarnert

답변

1

가장 좋은 방법은 DictReader/DictWriter을 사용하는 것입니다 PD /. dictrows는 CSV에서 DictReader 제조 사전 발전기이다 fieldName에

for row in dictrows: 
    out_f.write("%s%s" %(delimiter.join([row[name] for name in fieldnames]), 
       lineterminator)) 

는 필드의리스트이다.

+0

오타에 사과드립니다. 사전은 20GB까지 증가 할 수 있습니다. – user1717931

+0

@abarnet : 내 아이디어는 간단하며 충분하다고 생각합니다. 누구든지 멋진 트릭을 가지고 있다면 주위를 둘러 보았습니다 .-- 많은 경우에 나는 매우 효과적인 간단한 해결책을 보았습니다. – user1717931

+0

전 발전기를 사용하지 않았지만 아직 잘 모르겠습니다. 그러나, 나는 당신의 제안이 도움이 될 수있는 방법을 읽고 읽을 것입니다. 감사. – user1717931

관련 문제