2

次のコードは私のすべてのメモリを埋めます:

from sys import getsizeof
import numpy

# from http://stackoverflow.com/a/2117379/272471
def getSize(array):
    return getsizeof(array) + len(array) * getsizeof(array[0])


class test():
    def __init__(self):
        pass
    def t(self):
        temp = numpy.zeros([200,100,100])
        A = numpy.zeros([200], dtype = numpy.float64)
        for i in range(200):
            A[i] = numpy.sum( temp[i].diagonal() ) 
        return A

a = test()
memory_usage("before")
c = [a.t() for i in range(100)]
del a
memory_usage("After")
print("Size of c:", float(getSize(c))/1000.0)

出力は次のとおりです。

('>', 'before', 'memory:', 20588, 'KiB  ')
('>', 'After', 'memory:', 1583456, 'KiB  ')
('Size of c:', 8.92)

c が ~ 9 KiB の場合、なぜ ~1.5 GB のメモリを使用しているのですか? これはメモリリークですか?(ありがとう)

memory_usage関数は SO に投稿されており、明確にするためにここに報告されています。

def memory_usage(text = ''):
    """Memory usage of the current process in kilobytes."""
    status = None
    result = {'peak': 0, 'rss': 0}
    try:
        # This will only work on systems with a /proc file system
        # (like Linux).
        status = open('/proc/self/status')
        for line in status:
            parts = line.split()
            key = parts[0][2:-1].lower()
            if key in result:
                result[key] = int(parts[1])
    finally:
        if status is not None:
            status.close()
    print('>', text, 'memory:', result['rss'], 'KiB  ')
    return result['rss']
4

3 に答える 3

6

この問題は、numpy の 1.7.0 バージョンの斜め () 関数によって引き起こされます。1.7.1にアップグレードすると問題が解決しました!

この解決策は、numpy メーリング リストの Sebastian Berg と Charles Harris によって提供されました。

于 2013-06-13T15:12:33.430 に答える
1

Python は、必要に応じて OS からメモリを割り当てます。

必要がなくなった場合は、再度返す場合と返さない場合があります。

ただし、それが返されない場合、メモリはその後の割り当てで再利用されます。それを確認する必要があります。しかし、おそらくメモリ消費量はそれ以上増加しません。

メモリ消費量の見積もりについて: azorius が既に書いたように、temp配列は 16 MB を消費しますが、A配列は約 200 * 8 = 1600 バイト (内部的な理由で + 40) を消費します。それらを 100 個取得すると、164000 バイトになります (さらにリストの一部)。

それに加えて、あなたのメモリ消費については説明がありません。

于 2013-06-13T10:56:42.923 に答える