2017-01-28 132 views
0

作爲新的節目,我與Python玩弄這個腳本:64位Python的原因凍結

import itertools 
Lists=list(itertools.permutations(['a','b','c','d','e','f','g','h','i','j','k'])) 
print(len(Lists)) 

在32位的Python就會造成內存溢出錯誤。然而,當在64位Python上試用它並觀看任務管理器時,Python使用4 GB內存(我擁有8 GB內存),那麼我的計算機會凍結,我必須重新啓動它。

這是正常的行爲嗎?我該如何解決這個問題,或者限制Python可以訪問多少內存?

此外,如果我把這樣的東西轉換成.exe文件(用這個腳本來測試其他東西)會凍結其他計算機嗎?

回答

2

函數itertools.permutations()返回一個生成器,它按照字典順序延遲計算給定序列的所有可能排列。然後,您的代碼將所有這些排列明確地存儲在list中。

您的順序包含11個字母。爲了您的輸入,有11! = 39 916 800個排列。 Python不是特別有效的內存;對於4000萬個置換中的每一個,需要存儲這些值:

  • 指向列表對象的指針。 (64位Python上的8個字節)
  • 列表容器本身,包含11個指向字符串和鬆弛空間的指針。 (8×8字節)

因此,每個置換至少使用96個字節。添加一些填充和雜項浪費,我們可以估計每個排列使用150個字節的內存。乘以4000萬,我們得到6千兆字節。


如此高的內存使用情況解釋了爲什麼你的程序在32位的Python死亡(不能使用的RAM超過4 GB,並在實踐中是2 GB限制)。另外,當進程消耗大量內存時,如果啓用了一個頁面/交換文件,它可能會導致抖動。

限制Python內存限制的一種方法是通過操作系統提供的機制,如ulimit。另一種方法是諮詢resource module

+0

謝謝,你的回答很有意義。不應該python提供給我一個溢出錯誤,而不是凍結我的電腦嗎?就像上面的人說的,儘管它並沒有真正回答所問的問題:P感謝無論如何 – NightShade

+1

在Python 3.5上,我得到了使用'getsizeof(permutations)+ sum(getsizeof(p)for)估計的內存使用5.786255888 GB在排列組合)' –

+0

感謝您的建議,我使用Windows 10所以不能使用'ulimit',當我嘗試導入資源我得到模塊找不到錯誤 - 「沒有模塊命名'資源'。」也許我應該防止使用此函數生成超過特定大小的數組? – NightShade