2016-09-20 108 views
2

我寫了一個擴展素數的數據庫的程序。這個程序是用python編寫的,並且運行在Windows 8(x64)和8GB RAM上。使用比可用內存更多的內存

該程序將存儲的所有素數存儲在listintegers中作進一步計算,並在運行時使用RAM的大約6-7GB。然而,在一些運行中,這個數字降到了100MB以下。內存使用率在運行期間保持低電平,儘管隨着更多數字添加到主陣列中而增加。請注意,並非所有運行都會導致內存丟失。

的內存使用任務管理器測量

這些,看似隨意,滴,導致我下面的說法:

  1. 有一個在我的代碼中的錯誤,使其跌落關鍵的數據和搞亂結果(最有可能但不被結果支持)
  2. Python恰好在一段時間後極好地優化了我的代碼。
  3. Python或Windows正在通過清理我的素數數組中未使用過多的部分來補償RAM的過度使用。 (最終導致計算錯誤)
  4. Python或Windows正在通過分配磁盤空間而不是RAM來補償RAM過度使用。

問題

  1. 可能是什麼這個內存的原因(S)下降?
  2. python如何處理使用超過可用RAM的程序?
  3. Windows如何處理使用多於可用RAM的程序?

回答

5

1,2和3是不正確的理論。

4是正確的。 Windows(不是Python)正在將一些進程內存移動到交換空間。這對您的應用程序幾乎完全透明 - 您不需要做任何特殊的事情來應對或處理這種情況。你會注意到唯一的事情是你的應用程序可能會變慢,因爲信息是從磁盤寫入和讀取的。但這一切都透明。有關更多信息,請參閱https://en.wikipedia.org/wiki/Virtual_memory

+0

我是否正確地假設RAM中剩下的是最常用的數據(意味着列表的第一部分,幾乎總是被迭代)以及最新添加的數據(最後一部分列表)?而最沒有用的數據(中間)被髮送到交換空間? –

+0

@FelixZY:也許吧。 Windows(管理虛擬內存)不知道列表的哪一部分是哪一部分。這只是記憶的一頁,其中一些似乎比其他的更頻繁地使用。操作系統將那些看起來並沒有太多用處的東西換掉,作爲一名應用程序編寫者,您對哪一部分沒有太多的控制或知識。 –

1

你聽說過分頁嗎? Windows將一些內存(一段時間未使用過)轉儲到硬盤驅動器,以防止計算機耗盡或撞擊並最終崩潰。

只有Windows處理內存管理。儘管如果你使用Windows 10,它也會壓縮你的內存,有點像一個zip文件。

+0

我聽說過分頁,但我不確定它可以這種方式應用。見我的問題理論#4。 –

+0

是的Python應用程序不會做任何不同於任何其他應用程序。 –