如何用BeautifulSoup处理90GB的StackOverflow Posts.xml大文件?
处理超大StackOverflow Posts.xml文件的解决方案
问题核心是BeautifulSoup会把整个XML文件加载到内存中,对于90GB的文件来说完全不适用,必须用流式XML解析器来逐行处理,避免一次性加载全部内容。
推荐方案:使用Python的xml.etree.ElementTree流式解析
这个模块支持迭代解析,不需要一次性加载整个文件,内存占用极低。
示例代码
import xml.etree.ElementTree as ET # 迭代解析XML文件 for event, elem in ET.iterparse("Posts.xml", events=("start", "end")): # 只处理结束标签,确保完整读取row元素 if event == "end" and elem.tag == "row": post_type_id = elem.get("PostTypeId") if post_type_id == "1": # 筛选问题类型的帖子 print(elem.get("Body")) # 处理完当前元素后立即清除,释放内存 elem.clear()
代码说明
ET.iterparse是流式解析的核心,它会逐行读取XML,触发start和end事件- 只在
end事件处理row元素,保证获取到完整的属性内容 - 每次处理完元素后调用
elem.clear(),及时释放内存,避免内存累积
其他优化建议
- 如果不需要输出到控制台,直接写入文件可以提升效率,避免IO瓶颈:
with open("questions_body.txt", "w", encoding="utf-8") as out_f: for event, elem in ET.iterparse("Posts.xml", events=("end",)): if elem.tag == "row" and elem.get("PostTypeId") == "1": out_f.write(elem.get("Body") + "\n") elem.clear() - 避免使用BeautifulSoup、lxml的全量解析模式,这类工具都是为小文档设计的,不适合GB级别的大文件
内容的提问来源于stack exchange,提问作者dhokas
相关产品推荐
相关产品推荐

