列表是連續的元素序列。你可以創建列表前面,各項指標在存儲到None
參考:
lines = [None] * (255 + 4 + (512 * 3) * 767)
但隨後你會用它1178371(100萬個以上)的元素來創建對象。這會處理的內存相當數量只爲列表對象:
>>> import sys
>>> sys.getsizeof([None] * 1178371)
9427040
這就是9MB列表對象單獨,每個參考點到同一None
對象(這是一個單身,只是有記憶中有一次)。添加字符串,並且內存需求迅速攀升;很多空字符串需要超過40 MB:
>>> sys.getsizeof('') * 1178371
43599727
在Python 2,每一個額外的字符將添加一個字節,所以加平均字符串長度倍1MB的要求只是這個名單。如果你的字符串只有3個字符,那還是可行的。總共大約有50MB,但是如果你正在談論5000個字符串,你很容易以千兆字節爲單位。 5000個字符並不是那麼重要。
但是,您的索引不是連續的。你只生產255次767是195585年的指數;你似乎有一個稀疏的數據結構。你會更好使用字典在這種情況下:
lines = {}
for i in xrange(0,256):
for j in xrange(0,768):
lines[j + 4 + (512 * 3) * i]= str(A[i, j])
這可以作爲寫的,因爲現在每個指數在字典中鍵來代替。
如果你必須產生一個連續的序列,考慮不同的技術。如果從0到最後的所有指數都可以像上面這樣計算出來,那麼可以通過計算來生成每個值;給定一個索引,計算將在該索引處放置的字符串。這樣你就不需要預先製作所有的值。
上述循環指標按照特定的模式,所以你可以簡單地推導出i
和j
從給定指標:(!10個** 6 +元素的列表)
def str_for_index(index):
i = index // (512 * 3)
j = (index % (512 * 3)) - 4
if 0 <= i < 256 and 0 <= j < 768:
return str(A[i, j])
這是一個很大的數字,並不是所有的指數都會有價值。你確定列表是正確的數據結構嗎?如果這是一個稀疏序列(並非所有索引都有值),請考慮使用字典。 –
這不是一個稀疏序列,每個索引位置都有一個值。但它們並不是連續填充的。基於我的算法,每一組索引位置都以不同的方式填充。我只給出了一組值的代碼。那麼你建議我用什麼作爲數據結構 – user220789
創建一個包含超過一百萬個字符串的列表將會給你的內存需求帶來一些嚴重的壓力。 –