首页 > 解决方案 > 将大字符串写入文件时出现 Python 内存错误(来源为 XML/minidom)

问题描述

我一直在编写一些脚本来将大量 XML 数据从格式 1 转换为格式 2,以允许数据在系统之间迁移。我在 Windows 10 上使用 Python 3.8。

这是一次下班。有大量的数据不兼容,我必须在两个系统上进行逆向工程,以使数据兼容并手动转换大部分 XML 字段。学习 XLST 对于一项工作来说曲线太大了,我没有 SQL 经验来做这件事。

一切都很顺利,直到输出字符串达到我认为大约 86MB(限制可能比这要少很多,但它是第一个失败的文件)。

我已经使用 xml.etree.Elemtree 构建了 XML。

我需要打印漂亮的 XML 输出,并借用了我在 stackoverflow 上找到的使用 minidom 的美化函数:使用 xml.etree.elementtree 打印格式良好的 xml 文件- 复制到这里:

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = tostring(elem, 'ISO-8859-1')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="\t")

我的写入文件功能:

def write_to_file(root_xml,filenumber):
# Simply write the XML to the output folder
    file = open(outputxml + "\\" + filenumber + ".xml","w",encoding="UTF-8")
    file.write(prettify(root_xml))
    file.close
    return

我的错误:文件“C:\\mycode.py”,第 501 行,在 write_to_file file.write(prettify(root_xml)) MemoryError

我读到 minidom 不是处理数据的好方法,而且我可能不应该在内存中创建整个 XML。我即将到来的最大 XML 可能约为 250MB,甚至可能更高,而且我无法编写 86MB 的字符串。这似乎是一个简单的问题,但我被卡住了。

有没有好的解决方法?我真的希望不必重新设计大量代码来分块编写 XML 输出。有没有一种简单的方法可以将字符串分解成更小的部分,然后写入文件?其他想法?

谢谢!

标签: pythonxml

解决方案


如果其他人有类似的问题,我偶然发现了一个对我有用的答案,这只是因为我挂断了使用“prettify”写入文件。我停止使用 prettify 并将 XML 数据重新转换为 ElementTree,并且可以编写大型 XML 文件没问题(至少几百 MB):

    tree = ET.ElementTree(root_xml)
    tree.write("myxmlfile.xml")

我最终不需要我漂亮的印刷品。

很高兴任何代码天才提供反馈/批评或建议。


推荐阅读