2013-10-30 77 views
0

我目前正在從字典中逐行寫入一個csv文件。就像這樣:python從字典中批量寫入文件

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

我的問題是這樣的:我的字典裏得到大(比如說〜20 MB),我通過堆空間,我的Linux機器的限制。所以,在我編寫它之前,我沒有在我的字典中累積所有數據,而是在數據可用時立即將我的數據寫入csv文件 - 從我的字典(這只是一個記錄長)開始。

現在,我看到了另一個問題 - 時間。由於大量的IO操作(數千行寫入磁盤),我的程序運行非常緩慢。

我需要找到一箇中間地帶。或許,在我的字典中累積5000(k,v)個數據並將它寫出到磁盤中,刷新我的字典,等待下一個5000(k,v)對...繼續此過程。你還有其他建議嗎?

總之,有沒有一個很好的批量寫入文件?

謝謝, PD/

+0

20 MB時出現內存問題?你在嵌入式系統上運行它嗎? – Hyperboreus

+0

5000寫入和20MB數據應該是快速的,除非你在一個非常殘缺的系統上。在你的程序中,其他的東西很慢。嘗試寫入/ dev/null - 如果你有相同的緩慢,那麼它不是你的文件寫入造成的問題。 – tdelaney

+0

你的想法聽起來很簡單。真的,它只是在寫出代碼然後清除字典之前添加一個'if len(mydict)> = BATCH_SIZE:'。只要記得在最後寫出最後的部分批處理。你是否在尋找一個緩衝的CSV包裝,使其更容易?對於錯字, – abarnert

回答

1

你最好的選擇將使用DictReader/DictWriter。

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

其中dictrows是通過從DictReader CSV產生字典的發電機,FIELDNAMES是字段的列表。

+0

道歉。字典可能會增長到20 GB。 – user1717931

+0

@abarnet:我的想法很簡單,我認爲這就足夠了。我問周圍是否有人有一些很酷的技巧:-)很多時候,我看到簡單的解決方案非常有效。 – user1717931

+0

我之前沒有使用過發電機,但我對此還不太瞭解。不過,我會讀一讀,看看你的建議可能會有幫助。謝謝。 – user1717931