我遇到了一个丑陋的内存泄漏案例。我正在创建一个带有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方法不再使用,我几乎可以完全消除内存泄漏(或者它的影响可以忽略不计)。因此我怀疑问题可能在于那个特定的方法。
非常感谢任何帮助!
答案 0 :(得分:1)
引用this answer,我能够使用
删除find_floor_hints方法上的泄漏hint_ids.add(str(hint.localization.contents))
似乎前者返回了一个Navigable String,即使在删除FloorSoup对象之后,它似乎也会留下一些(读取:很多)引用。我不确定它是否是一个错误或一个功能,但它确实有效。