python 中的高内存使用率
High memory usage in python
下面是简单的python代码:
class Node:
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
if __name__ == '__main__':
nodes = []
for i in xrange(1, 7 * 1000 * 1000):
if i % 1000 == 0:
print i
nodes.append(Node())
占用千兆字节的内存;
我认为这是不合理的。 python 这正常吗?
我该如何解决这个问题?(在我的原始代码中,我有大约 700 万个对象,每个对象有 10 个字段,需要 8 GB 的 RAM)
如果您有固定数量的字段,那么您可以使用 __slots__
来节省大量内存。请注意 __slots__
确实有一些限制,因此请确保在选择在您的应用程序中使用它们之前仔细阅读 Notes on using __slots__
:
>>> import sys
>>> class Node(object):
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
...
>>> n = Node()
>>> sys.getsizeof(n)
64
>>> class Node(object):
__slots__ = ()
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
...
>>> n = Node()
>>> sys.getsizeof(n)
16
Python 是一种天生的内存密集型编程语言。有一些方法可以解决这个问题。 __slots__
是一种方式。另一种更极端的方法是使用 numpy 来存储数据。您可以使用 numpy 来创建结构化数组或记录——一种使用最少内存的复杂数据类型,但与普通 python class 相比,功能会大大减少。也就是说,您正在使用 numpy 数组 class,而不是您自己的 class——您不能在数组上定义自己的方法。
import numpy as np
# data type for a record with three 32-bit ints called x, y and z
dtype = [(name, np.int32) for name in 'xyz']
arr = np.zeros(1000, dtype=dtype)
# access member of x of a record
arr[0]['x'] = 1 # name based access
# or
assert arr[0][0] == 1 # index based access
# accessing all x members of records in array
assert arr['x'].sum() == 1
# size of array used to store elements in memory
assert arr.nbytes == 12000 # 1000 elements * 3 members * 4 bytes per int
查看更多here.
下面是简单的python代码:
class Node:
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
if __name__ == '__main__':
nodes = []
for i in xrange(1, 7 * 1000 * 1000):
if i % 1000 == 0:
print i
nodes.append(Node())
占用千兆字节的内存; 我认为这是不合理的。 python 这正常吗?
我该如何解决这个问题?(在我的原始代码中,我有大约 700 万个对象,每个对象有 10 个字段,需要 8 GB 的 RAM)
如果您有固定数量的字段,那么您可以使用 __slots__
来节省大量内存。请注意 __slots__
确实有一些限制,因此请确保在选择在您的应用程序中使用它们之前仔细阅读 Notes on using __slots__
:
>>> import sys
>>> class Node(object):
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
...
>>> n = Node()
>>> sys.getsizeof(n)
64
>>> class Node(object):
__slots__ = ()
NumberOfNodes = 0
def __init__(self):
Node.NumberOfNodes += 1
...
>>> n = Node()
>>> sys.getsizeof(n)
16
Python 是一种天生的内存密集型编程语言。有一些方法可以解决这个问题。 __slots__
是一种方式。另一种更极端的方法是使用 numpy 来存储数据。您可以使用 numpy 来创建结构化数组或记录——一种使用最少内存的复杂数据类型,但与普通 python class 相比,功能会大大减少。也就是说,您正在使用 numpy 数组 class,而不是您自己的 class——您不能在数组上定义自己的方法。
import numpy as np
# data type for a record with three 32-bit ints called x, y and z
dtype = [(name, np.int32) for name in 'xyz']
arr = np.zeros(1000, dtype=dtype)
# access member of x of a record
arr[0]['x'] = 1 # name based access
# or
assert arr[0][0] == 1 # index based access
# accessing all x members of records in array
assert arr['x'].sum() == 1
# size of array used to store elements in memory
assert arr.nbytes == 12000 # 1000 elements * 3 members * 4 bytes per int
查看更多here.