2012-07-23 43 views
3
a=raw_input() 
prefix_dict = {} 
for j in xrange(1,len(a)+1): 
    prefix = a[:j] 
    prefix_dict[prefix] = len(prefix) 
print prefix_dict 

在上面的代碼中是否有任何內存錯誤的可能性?此代碼在服務器上運行,服務器是運行32位Ubuntu(Ubuntu 12.04 LTS)的四核至強機。少數情況下,它的工作和少數顯示內存錯誤。供參考:我不知道他們正在測試的情況,但輸入是小寫字母。輸入大小< = 10,000內存錯誤的可能性?

+0

稍微偏離主題,但在這段代碼中,'LEN(前綴)'總是等於'j'。沒有必要做'len(前綴)'。 – 2012-07-23 19:11:31

+0

我有一個問題。可以通過raw_input()讀入的內容是懶惰的,你會怎麼做? – octopusgrabbus 2012-07-23 19:19:09

+1

當然。特別是如果你在獲得它之前分配了很多大對象。 – 2012-07-23 19:05:54

回答

0

只有數據的內存量爲1 + 2 + 3 ... + n-2 + n-1 + n其中n是輸入的長度,換句話說,len(a)。這可以解釋爲(n + 1)* n/2。如果n是10,000,則可以處理大約50 MB的字符串數據,不過,python字典使用大量RAM來存儲10,000個條目。測試在我的OSX中,這似乎是最小的,事實上,如果我在其上運行該代碼,過程顯示使用53.9 MB:

str = "a" 
d = {} 
for i in xrange(10000): 
    d[str] = i 
    str = str + "a" 

我看不出有什麼明顯地你的代碼錯誤,當我上運行一串長達10,000個字符的字符串,它很高興地吐出大約50MB的輸出,所以其他的一定會出錯。

top顯示該進程的內存使用情況如何?

0

也許一個較小的一段代碼將有助於:

prefix_dict = { a[:j]:j for j in xrange(1, len(a) + 1) } 
+2

如何?幾個字節碼指令更多地佔用幾個字節;顯然這與存儲多少數據相比是不可能的。 – delnan 2012-07-23 19:37:35

+0

@delnan:同樣'前綴'作爲中間存儲被報廢。也許垃圾收集器在循環中不工作,然後大約5000 * 10000字節保存在內存中。 – 2012-07-23 19:48:38

+1

重新計數始終有效,循環GC不關心Python循環。但是這並不重要,因爲前綴引用的字符串由於predix_dict而仍然可以訪問。 – delnan 2012-07-23 19:53:22