You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中高效写入大文件:XML转JSONL批量写入方案

100GB XML转JSONL的Python实现方案

你的逐行写入代码是否可行?

这段代码完全可行,但需要注意两个细节:

  • process_line函数必须返回带换行符\n的JSON字符串(JSONL要求每行一个独立JSON对象),比如用json.dumps(obj) + '\n'生成结果
  • 要跳过XML中的空行或无效行,避免写入空内容

Python的文件对象默认带有系统级缓冲,并非每写一行就立刻刷入磁盘——当缓冲区达到阈值(通常是几KB到几MB)时才会执行实际磁盘写入,所以默认性能已经足够应对大部分场景。

手动批量写入优化方案

如果想进一步减少I/O系统调用次数、提升大文件处理速度,可以用缓冲区攒批量数据后一次性写入:

import json
import xml.etree.ElementTree as ET

def process_line(line):
    line = line.strip()
    if not line:
        return None
    # 用ElementTree解析单条XML标签,比手动分割更健壮
    try:
        elem = ET.fromstring(line)
        # 这里根据你的XML结构调整:比如提取属性、子元素内容等
        json_obj = dict(elem.attrib)
        return json.dumps(json_obj) + '\n'
    except ET.ParseError:
        # 跳过解析失败的无效行(比如注释、格式错误的标签)
        return None

# 批量大小可根据内存情况调整,比如10000条(每条按1KB算仅占10MB内存)
BATCH_SIZE = 10000
buffer = []

with open('input.xml', 'r') as ip, open('output.jsonl', 'w') as op:
    for line in ip:
        json_str = process_line(line)
        if json_str:
            buffer.append(json_str)
            # 缓冲区满则批量写入
            if len(buffer) >= BATCH_SIZE:
                op.writelines(buffer)
                buffer = []
    # 处理最后一批剩余数据
    if buffer:
        op.writelines(buffer)

关键注意事项

  • 解析XML时优先用xml.etree.ElementTree或lxml库,避免手动字符串分割导致的格式错误
  • 若XML行包含特殊字符(比如引号、转义符),json.dumps会自动处理转义,无需手动干预
  • 可以根据系统内存调整BATCH_SIZE:内存充足时调大(如50000),内存紧张时调小(如1000),平衡内存占用和写入效率

内容的提问来源于stack exchange,提问作者hrushikeshrv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:35:09