我有一个运行时间很长的脚本,它解析一个大的 XML 文件(~9GB)并将数据分块插入到数据库中。就是这个样子
import lxml.etree as ET
import gc
def __get_elements1(self):
context = ET.iterparse(tmp_folder + file_path, events=("start", "end"), tag='Elements1')
elements = []
try:
for event, element in context:
if event == "end":
elements_result = tuple([child.text for child in element])
elements.append(elements_result)
element.clear()
while element.getprevious() is not None:
del element.getparent()[0]
if len(elements) == self.chunk_size:
# insert data to database
if len(elments) > 0:
# insert data to database
except Exception as e:
logging.error(e)
del context
del elements
gc.collect()
在这里,我正在寻找具有特定标签的元素并对其进行解析。现在,我几乎没有其他函数可以解析同一文件中的不同标签。代码几乎相同,只是稍作修改。我实际上想并行运行这些,但即使我按顺序运行它们,我也面临一个问题。
我的第一个函数运行良好且不消耗太多资源,但是,当我执行第二个函数时,内存消耗量猛增,我的应用程序失败了。这没有任何意义,尤其是因为我正在通过我的第一个函数解析具有最多数据的元素。我的第二个功能可以被认为是这样的,
def __get_elements2(self):
context = ET.iterparse(tmp_folder + file_path, events=("start", "end"), tag='Elements2')
elements = []
try:
for event, element in context:
if event == "end":
elements_result = tuple([child.text for child in element])
elements.append(elements_result)
element.clear()
while element.getprevious() is not None:
del element.getparent()[0]
if len(elements) == self.chunk_size:
# insert data to database
if len(elments) > 0:
# insert data to database
except Exception as e:
logging.error(e)
del context
del elements
gc.collect()
请注意,给上述iterparse
函数的标签是不同的。
这可能是什么原因?是否可能存在内存泄漏?我想不出别的了。我该如何解决这个问题?