【问题标题】:How to reset tree without wasting memory?如何在不浪费内存的情况下重置树?
【发布时间】:2018-02-17 06:23:18
【问题描述】:

我有一个 Python 代码,它从根节点向上构造一个四叉树,并根据需要引入新节点。

这个四叉树需要不断地重构我目前所做的是,每次需要重构四叉树时,我将根节点的子节点列表重置为空列表,并从根开始构建树.

我担心的是,前一棵树的所有节点(根节点除外)仍会存在于内存中。在整个程序过程中,树可能会被重建数万次,平均可能包含 5000 个节点,所以如果内存过载,我不会感到惊讶。

为了不超过内存限制,我不是必须以某种方式删除所有以前的节点吗?我该怎么做?

【问题讨论】:

  • 所以你并不是说你要插入新节点并且需要以某种方式重新塑造你的树,而是你正在拆除你的树(例如基于数据集 A)并构建一个新的(基于 B 数据集)?
  • 程序的工作方式是每次都必须从根向上构建树。一旦我们使用数据集 B 重建树,我们就不关心使用数据集 A 的前一棵树的节点中的数据。我所拥有的是我不会“拆除”树 A。我不会重写树 A 的节点。我从同一个根节点开始构造一棵全新的树 B(我首先将其子节点重置为空)。因此,在构造 B 之后,如果我理解正确的话,来自树 B 和树 A 的节点对象都存储在内存中。我应该做的是删除树A,但我不知道如何。

标签: python algorithm list memory memory-management


【解决方案1】:

使用del,像这样:

del children

如果列表children 没有在其他任何地方引用,则确保列表的内存将被释放。

您必须遍历整个树才能删除每个节点,这很容易递归完成。

阅读更多how to release used memory immediately in python list?

【讨论】:

  • 但这如何解决问题?树的每个节点都有两个关联的列表:一个存储节点信息的列表“数据”和一个包含节点对象的列表“孩子”。即使我删除了一个节点的列表“孩子”,该节点的孩子(他们自己的节点对象)仍将存储在内存中。我必须遍历树中的所有节点对象并一一删除,不是吗?
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2012-06-10
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多