我已经解决了这个问题,但我想知道为什么它首先造成的。我使用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会占用这么多内存吗?
可能是因为str(span.contents)
在对象__str__
中调用span.contents
函数并返回一个较小的表示。您可以使用pympler来测量内存消耗
老东西,但以防其他人想知道:span.contents
返回对NavigableString
实例的引用。此实例与DOM树之间存在链接,因此只要此实例正在使用中,垃圾收集器就无法从内存中释放整个DOM树。因此,只要restaurant.name
没有从内存中释放,整个DOM树就会保存在内存中。
使用str(span.contents)
返回一个未与DOM树链接的字符串,因此它不会阻止DOM树从内存中释放。