BeautifulSoup的Python内存问题

问题描述 投票:1回答:2

我已经解决了这个问题,但我想知道为什么它首先造成的。我使用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会占用这么多内存吗?

python memory beautifulsoup
2个回答
1
投票

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


1
投票

老东西,但以防其他人想知道:span.contents返回对NavigableString实例的引用。此实例与DOM树之间存在链接,因此只要此实例正在使用中,垃圾收集器就无法从内存中释放整个DOM树。因此,只要restaurant.name没有从内存中释放,整个DOM树就会保存在内存中。

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

© www.soinside.com 2019 - 2024. All rights reserved.