python - 将大字符串写入文件时出现 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 输出。有没有一种简单的方法可以将字符串分解成更小的部分,然后写入文件?其他想法?
谢谢!
解决方案
如果其他人有类似的问题,我偶然发现了一个对我有用的答案,这只是因为我挂断了使用“prettify”写入文件。我停止使用 prettify 并将 XML 数据重新转换为 ElementTree,并且可以编写大型 XML 文件没问题(至少几百 MB):
tree = ET.ElementTree(root_xml)
tree.write("myxmlfile.xml")
我最终不需要我漂亮的印刷品。
很高兴任何代码天才提供反馈/批评或建议。
推荐阅读
- installation - 仅在使用 Inno Setup 安装较新版本的应用程序时覆盖现有数据文件
- c# - 数据加载错误 - 由于数据类型无效,无法处理数据预期:数组接收:字符串
- html - 如何在html中获取符号而不是值?
- java - 当用户登录时,我想显示他们的姓名和图像,名称显示来自 mysql 数据库,但图像没有
- database - 在 Windows 8 中安装 Oracle 11gR2
- entity-framework-6 - 实体框架一对多 - 空虚拟集合
- java - 在 Grails 中动态创建可用脚手架的菜单
- python - 在heroku上安装pdftotext库
- c# - 有没有办法避免使用 interop.word 出现分页符的空白页?
- postgresql - 是否可以在零停机时间的情况下将 postgres 9.6 升级到 10。可以遵循哪些方法?