2011-03-30 79 views
3

我有一個shell腳本,它調用大約20個python腳本,每個腳本讀取至少500MB大小的文件。在運行幾個python腳本後,8GB內存中有40MB。我嘗試了下面的命令,它工作並給我留下了5.8 GB的內存空間。釋放linux頁面緩存

echo 1 > /proc/sys/vm/drop_caches 

是否有一種編程方式來從python做這件事?或者我如何強制python釋放它佔用的內存?

+2

你爲什麼想這樣做?當Linux需要其他內存的內存時,Linux通常足夠聰明以放棄緩存頁面。除非您能證明您可以通過這種方式提高績效,否則認爲您不需要這樣做會更安全。 – 2011-03-30 08:03:55

回答

1

drop_caches-file是一個特定於linux的東西,而不是Python的東西。 Python已經釋放了內存,它只是沒有從緩存中釋放內存的操作系統。

我不知道有足夠的python把代碼扔在我腦袋裏,但爲什麼不直接用上面的「echo」語句進行系統調用或直接寫入proc文件系統呢? (確保腳本在Linux機器上運行,當然,後)。

+0

我同意其具體的linux,但應該有一些方法在python中做類似的事情。 – Boolean 2011-03-30 07:29:16

+0

Python已經釋放了內存,它只是沒有從緩存中釋放內存的操作系統。 – grimmig 2011-03-30 07:29:42

+0

明白了。正如您所說,我可以執行系統調用或命令,是否有最佳實踐方式。 – Boolean 2011-03-30 07:31:45

0

編輯lunaryorn更是直線前進和Python的,但它可以imporved到:

os.system('sync') 
open('/proc/sys/vm/drop_caches','w').write("1\n") 
+0

如果我調用同步,是否需要運行drop cache? – Boolean 2011-03-30 07:36:41

+0

drop_caches不會清除髒對象,因爲它是非破壞性操作,但通過使用同步,可以對所有髒頁面執行操作並將其清除 – P2bM 2011-03-30 07:41:42

+0

同步啓動將緩衝的文件系統數據從內存寫入(物理)磁盤。通常在彈出USB驅動器之前使用。我懷疑這會對這種情況有所幫助。 – grimmig 2011-03-30 07:42:44

5

你爲什麼不簡單地打開文件並寫入它?

with open('/proc/sys/vm/drop_caches', 'w') as stream 
    stream.write('1\n') 

這些確實是Python的基礎知識。

0

@lunaryorn和@P2bM的答案是正確的,但存在安全隱患,因爲它們要求您使用root權限運行整個python腳本。至少,如果你的腳本是一個正在開發中的實驗,並且它是瘋狂的,那麼它可以隨意破壞系統。

另一個副作用是由您的腳本(日誌等)創建的所有文件都將由root創建 - 而不是由您創建。這對於以後的處理不太方便。

它是更安全限制sudo到只需要:

import os 

os.system('sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"') 
os.system('sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"') 
with open('sample.txt', 'w') as f: 
    f.write('a') 

這將提示您一次輸入根口令(這樣它可以後獨立運行),以及您可以驗證文件sample.txt由您創建,而不是由根創建。