2014-06-13 21 views
1

我已經編寫了一個多線程的Web搜尋器,用於收集要寫入非常大的csv文件的數據。唯一的問題是,該程序目前正在使用大量內存(擁有15GB內存,我的計算機的所有物理內存都在使用)。我不知道Python是如何管理後臺的內存,但程序似乎是功能,但我經常得到這些暫停,我認爲這是與python或系統做一些「記憶魔術」背景。唯一的可能是CPU使用率。逐步將CSV數據寫入硬盤以減少內存使用量

無論如何,我認爲逐步將數據寫入硬盤以減少內存使用量會有所幫助。我沒有對數據做任何額外的操作,所以我真的不需要它在內存中。

我想我可以做這樣的事情:

# out_queue is queue.Queue() object containing data to be written 
def csv_writer(out_queue): 

    with open(file, 'w+') as csvfile: 
     writer = csv.writer(csvfile,delimiter=',') 
     while True: 
      task = out_queue.get() 
      writer.writerow(task) 
      task.task_done() 

但我不是不知道open功能是如何工作的,閱讀它說,返回一個文件對象的文件,但我不確定那真的意味着什麼。所以我想這裏的主要問題是:

如果我使用的是with open語句,打開的文件是否保存在內存中?閱讀文檔並沒有特別的幫助我。

我也讀了一些關於打開緩衝文件,在這種情況下會有幫助嗎?

如果您有任何其他提示,對於那些處理這類問題的人,有沒有更好的解決方法?或者我應該把它留給python來處理?

+0

對不起,可能沒有解釋清楚,我的記憶問題是因爲我把所有從網上抓取的數據都保存在內存中。目前該程序的結構可以在所有我的刮刀線程退出後將所有數據寫入文件。 –

回答

3

不,使用文件對象作爲上下文管理器(通過with語句)不會導致它將所有數據保存在內存中。它所做的只是確保文件對象在退出上下文時關閉。文件對象已經有緩衝區寫入,但緩衝區至多保存幾千字節。 csv.writer()對象立即將數據寫入基礎文件對象,但不保留數據。

你的問題在別處,你在這裏顯示的代碼將而不是堅持千兆字節的內存。使用內存分析器(例如HeapPymemory_profiler)來找出導致您的進程使用如此多內存的原因。

相關問題