1

我已经解决了这个问题,但我想知道为什么它是首先引起的。我使用 BeautifulSoup 从网页中识别出这个跨度:

span = <span id="ctl00_ContentPlaceHolder1_RestInfoReskin_lblRestName">Ally's Sizzlers</span>

然后我分配这个变量:

restaurant.name = span.contents

然而,在每个循环中,这会占用整整 1 MB,并且大约有 20,000 个循环。通过反复试验,我找到了这个解决方案:

restaurant.name = str(span.contents)

你能告诉我为什么以前的 span.contents 占用这么多内存吗?

4

2 回答 2

2

可能是因为str(span.contents)调用__str__对象内部的函数span.contents并返回较小的表示。您可以使用pympler来测量内存消耗

于 2012-11-20T20:38:08.187 回答
1

老东西,但以防其他人想知道:span.contents返回对NavigableString实例的引用。这个实例和 DOM 树之间是有联系的,所以只要这个实例在使用中,垃圾回收器就不能从内存中释放整个 DOM 树。因此,只要restaurant.name不从内存中释放,整个 DOM 树就保存在内存中。

usingstr(span.contents)返回一个没有与 DOM 树链接的字符串,因此它不会阻止 DOM 树从内存中释放。

于 2018-03-03T20:51:30.017 回答