1

我有一个运行时间很长的脚本,它解析一个大的 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函数的标签是不同的。

这可能是什么原因?是否可能存在内存泄漏?我想不出别的了。我该如何解决这个问题?

4

0 回答 0