Beautifulsoup内存泄漏

时间:2017-03-05 11:47:08

标签: python memory-leaks beautifulsoup

我遇到了一个丑陋的内存泄漏案例。我正在创建一个带有beutifulsoup的对象,然后通过自己的方法处理它。我用~2000个XML文件做这个。处理了大约一半后,由于MemoryError,程序停止工作,性能不断下降。我尝试通过 class Program { static void Main(string[] args) { SealedClass objSeald = new SealedClass(); objSeald.Name = "Blah blah balh"; objSeald.Print(); } } 上的soup.decompose方法解决它,并在处理完每个文件后强制使用gc.collect。

__del__

我用来创建对象并调用方法的代码的相关部分:

class FloorSoup:
def __init__(self, f_id):
    only_needed = SoupStrainer(["beacons", 'hint'])
    try:
        self.f_soup = BeautifulSoup(open("Data/xmls/floors/floors_" + f_id + ".xml", encoding='utf8'), "lxml", parse_only = only_needed)
    except (FileNotFoundError):
        print("File: Data/xmls/floors/floors_" + f_id + ".xml not found")

def __del__(self):
    self.f_soup.decompose()

def find_floor_npcs(self):
    found_npcs = set()
    for npc in self.f_soup.find_all(text="npc"):
        found_npcs.add(npc.parent.parent.values.string)
    return found_npcs

def find_floor_hints(self):
    hint_ids = set()
    print("Finding hints in file")
    for hint in self.f_soup.find_all('hint'):
        hint_ids.add(hint.localization.string)
    return hint_ids

通过使find_floor_hints方法不再使用,我几乎可以完全消除内存泄漏(或者它的影响可以忽略不计)。因此我怀疑问题可能在于那个特定的方法。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

引用this answer,我能够使用

删除find_floor_hints方法上的泄漏
hint_ids.add(str(hint.localization.contents))

似乎前者返回了一个Navigable String,即使在删除FloorSoup对象之后,它似乎也会留下一些(读取:很多)引用。我不确定它是否是一个错误或一个功能,但它确实有效。