假设你有大量Node
正在创建,您可以考虑使用__slots__ https://docs.python.org/3/reference/datamodel.html#slots为每个预定义一组固定的属性Node
。这消除了存储每个实例的开销__dict__
(以防止创建未声明的属性作为交换)并且可以轻松地减少每个内存的使用量Node
约 5 倍(在 Python 3.3+ 上较少,其中共享密钥__dict__免费降低每个实例的内存成本 https://docs.python.org/3/whatsnew/3.3.html#pep-412-key-sharing-dictionary).
很简单,只需更改声明即可Node
to:
class Node(object):
__slots__ = 'osmid', 'latitude', 'longitude', 'count'
def __init__(self, osmid, latitude, longitude):
self.osmid = int(osmid)
self.latitude = float(latitude)
self.longitude = float(longitude)
self.count = 0
例如,在 Python 3.5 上(其中共享密钥字典已经为您节省了一些东西),可以通过以下方式看到对象开销的差异:
>>> import sys
>>> ... define Node without __slots___
>>> n = Node(1,2,3)
>>> sys.getsizeof(n) + sys.getsizeof(n.__dict__)
248
>>> ... define Node with __slots__
>>> n = Node(1,2,3)
>>> sys.getsizeof(n) # It has no __dict__ now
72
请记住,这是具有共享密钥字典的 Python 3.5;在 Python 2 中,每个实例的成本为__slots__
会类似(一个指针大小的变量更大 IIRC),而成本没有__slots__
会增加几百个字节。
另外,假设您使用的是 64 位操作系统,请确保您已安装 64 位版本的 Python 以匹配 64 位操作系统;否则,Python 将被限制为约 2 GB 的虚拟地址空间,而您的 6 GB RAM 就显得微不足道了。