簡體   English   中英

復雜度較高的Python 2.7內存錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM