在python集中删除和添加元素时意外的内存消耗

ve7v8dk2  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(299)

我正在处理一个问题,这个问题需要在集合上大量使用add和remove操作。集合的总大小保持不变(即,以后替换相同数量的已删除元素)。然而,我观察到内存消耗随着时间的推移而增加。
这是产生问题的代码的简化:

  1. import psutil, os
  2. def mem():
  3. return psutil.Process(os.getpid()).memory_info().rss / 1024**2
  4. print("START:", mem())
  5. s = set()
  6. for i in range(2000000):
  7. s.add((i, i))
  8. print(f"FILLED WITH 'add()' ({len(s)} items):", mem())
  9. for i in range(2000000):
  10. s.remove((i, i))
  11. print(f"REMOVED ({len(s)} items):", mem())
  12. for i in range(2000000):
  13. s.add((i, i - 1))
  14. print(f"FILLED WITH 'add()' ({len(s)} items):", mem())

在我的机器(ubuntu 20.04,python 3.8.5)中,此代码生成以下输出:

  1. START: 11.76953125
  2. FILLED WITH 'add()' (2000000 items): 261.9609375
  3. REMOVED (0 items): 76.61328125
  4. FILLED WITH 'add()' (2000000 items): 323.88671875

如果我用一个新的集合替换集合s,我将获得以下值:

  1. import psutil, os
  2. def mem():
  3. return psutil.Process(os.getpid()).memory_info().rss / 1024**2
  4. print("START:", mem())
  5. s = set()
  6. for i in range(2000000):
  7. s.add((i, i))
  8. print(f"FILLED WITH 'add()' ({len(s)} items):", mem())
  9. for i in range(2000000):
  10. s.remove((i, i))
  11. print(f"REMOVED ({len(s)} items):", mem())
  12. s = set()
  13. print(f"NEW SET:", mem())
  14. for i in range(2000000):
  15. s.add((i, i - 1))
  16. print(f"FILLED WITH 'add()' ({len(s)} items):", mem())
  1. START: 11.7265625
  2. FILLED WITH 'add()' (2000000 items): 261.91015625
  3. REMOVED (0 items): 76.56640625
  4. NEW SET: 12.5625
  5. FILLED WITH 'add()' (2000000 items): 354.44921875

我对这些记忆增长有点困惑。
谢谢你的帮助!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题