我遇到了内存错误,我正在尝试为这个问题找到最佳解决方案。基本上我通过同一类的多个线程下载了很多 XML 文件。我的班级使用以下命令下载文件:
urlretrieve(link, filePath)
我将下载文件的路径保存到线程之间同步的队列中。
downloadedFilesQ.put(filePath)
在另一个类(也是多个线程)中,我尝试解析这些 XML 文件并将它们保存为 Python 对象,以便将来保存在数据库中。我正在使用以下命令来解析文件:
xmldoc = minidom.parse(downloadedFilesQg.get())
下载和解析流程同时运行。下载流程在大约 2 分钟后完成,而解析流程大约需要 15 分钟。15 分钟后,我在以下行出现内存错误:
Exception in thread XMLConverterToObj-21:
Traceback (most recent call last):
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\myuser\PycharmProjects\weat\Parsers\ParseXML.py", line 77, in parseXML
xmldoc = minidom.parse(xml_file)
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\xml\dom\minidom.py", line 1958, in parse
return expatbuilder.parse(file)
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\xml\dom\expatbuilder.py", line 911, in parse
result = builder.parseFile(fp)
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\xml\dom\expatbuilder.py", line 207, in parseFile
parser.Parse(buffer, 0)
File "c:\_work\16\s\modules\pyexpat.c", line 417, in StartElement
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\xml\dom\expatbuilder.py", line 746, in start_element_handler
_append_child(self.curNode, node)
File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\lib\xml\dom\minidom.py", line 291, in _append_child
childNodes.append(node)
MemoryError
我考虑的选项是,一旦我达到 100K python 对象,将它们保存到数据库,然后再次继续解析。问题是多个业务可以重复,因此我想解析一次所有文件,然后将业务插入到一个集合中(以忽略重复的业务)。
我还有其他可以尝试的方法吗?
慕田峪4524236
相关分类