2012-11-20 36 views
1

我已經解決了這個問題,但我不知道爲什麼它擺在首位造成的。我用BeautifulSoup從網頁識別此跨度:Python的內存問題與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佔據了太多的內存?

回答

1

可能因爲str(span.contents)正在調用對象span.contents中的__str__函數並返回一個較小的表示形式。您可以使用pympler來測量內存消耗

1

舊的東西,但以防萬一其他人想知道:span.contents返回對NavigableString實例的引用。有此實例與DOM樹之間的聯繫,所以,只要這種情況下是在使用時,整個DOM樹不能從內存由垃圾收集器釋放。因此,只要restaurant.name不從內存中釋放,整個DOM樹被保存在內存中。

使用str(span.contents)的回報這是不符合DOM樹掛,所以它不會阻止DOM樹從內存中釋放的字符串。