[英]Python 2.7 memory error for large complexity
我是python的新手。 我正在運行以下代碼,並且使用python2.7給出了內存錯誤。 由於我使用的是opencv,因此我正在使用python2.7。 我已經閱讀了以前的帖子,但是我對它們的了解不多。
s={}
ns={}
ts={}
for i in range(0,256): #for red component
for j in range(0,256): #for green component
for k in range(0,256): # for blue component
s[(i,j,k)]=0
ns[(i,j,k)]=0
ts[(i,j,k)]=i*j*k
請幫忙。 該代碼嘗試存儲紅色,綠色和藍色分量的頻率。 為此,我將這些值初始化為零
事情1:使用itertools
而不是每次循環都構造所有range
列表。 xrange
將返回一個類似於range
的迭代器對象,而product
將返回一個迭代器,該迭代器從給定的iterable中選擇元素的元組。
事情2:將numpy
用於大數據。 這是為此類事情設計的矩陣實現。
>>> import numpy as np
>>> from itertools import product
>>> x=np.zeros((256,256,256))
>>> for i, j, k in product(xrange(256), repeat=3):
... x[i,j,k]= i*j*k
...
對我來說大約需要五秒鍾,並且需要預期的內存量。
$ cat /proc/27240/status
Name: python
State: S (sleeping)
...
VmPeak: 420808 kB
VmSize: 289732 kB
請注意,如果嘗試分配三個256 * 256 * 256陣列,則實際上可能會遇到系統范圍的內存限制,因為每個陣列都有大約1700萬個條目。 幸運的是,numpy使您可以將陣列持久化到磁盤。
您是否遇到過PIL(Python影像庫) ? 您可能會發現它很有幫助。
實際上,您的程序至少需要(!)300 * 300 * 300 * 4 * 3個字節來作為dict的值數據。 此外,您的鍵元組占用300 * 300 * 300 * 3 * 3 * 4字節。
這總共是12.96億字節,即1.2 GiB數據。
該計算甚至不包括在dict中維護數據的開銷。
因此,這取決於您的計算機是否出現故障而擁有的內存量。
你可以邁出第一步
s = {}
ns = {}
ts = {}
for i in range(0, 300):
for j in range(0, 300):
for k in range(0, 300):
index=(i, j, k)
s[index]=j
ns[index]=k
ts[index]=i*j*k
從理論上講,它僅會占用以前一半的內存-同樣,由於重用了索引元組,因此僅用於數據。
根據您所描述的(您只想計數),您不需要預先組合全部組合。 因此,您可以省略問題中顯示的初始化,而是建立一個存儲,在其中僅將這些值存儲在實際有數據的地方,據說這些數據要比可能的少得多。
您可以使用defaultdict()
或手動模仿其行為,因為我認為您的顏色“調色板”中並未使用大多數組合。
from collections import defaultdict
make0 = lambda: 0
s = defaultdict(make0)
ns = defaultdict(make0)
# what is ts? do you need it?
現在,您有了三個dict
的對象,可以在需要時將其寫入。 然后,對於您實際擁有的每種顏色組合,可以分別執行s[index] += 1
。 ns[index] += 1
。
我不了解您的ts
也許您可以計算出來,或者必須找到其他解決方案。
即使所有變量都使用單個字節,該程序也將需要405 MB RAM。
您應該使用壓縮在有限的空間中存儲更多內容。
編輯:如果要在Python中制作直方圖, 請參見使用Python圖像庫(PIL)的示例 。 這三行代碼完成了艱苦的工作:
import Image
img = Image.open(imagepath)
hist = img.histogram()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.