如何在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
相关产品推荐
相关产品推荐

