读取大体积.gz压缩JSON文件前n行时性能异常的问题求助
问题原因及解决办法
循环读取耗时极长的原因
你误解了readlines()的参数用法:gzip.open返回的文件对象中,readlines(sizehint)的参数不是要读取的行数,而是字节数的提示值。当你在循环里传入line变量时,第一次循环line=0,readlines(0)会触发读取整个文件直到EOF——这意味着要解压完整的4GB压缩文件,自然会耗时极久。
替代方案
方案1:逐行读取n次
用next()函数每次读取一行,循环指定次数,简单直接:
import ast import gzip no_of_lines = 1 with gzip.open('/path/to/my/data/data.json.gz','rt') as f: for _ in range(no_of_lines): line = next(f) print(ast.literal_eval(line)['events'])
方案2:用itertools.islice批量取前n行
如果需要读取的行数较多,用islice更高效,无需手动控制循环:
import ast import gzip from itertools import islice no_of_lines = 1 with gzip.open('/path/to/my/data/data.json.gz','rt') as f: for line in islice(f, no_of_lines): print(ast.literal_eval(line)['events'])
额外建议:优化JSON解析
如果你的每行内容是标准JSON格式(去掉外层列表包裹后),建议用json.loads替代ast.literal_eval,安全性和性能都更优:
import json # 替换原代码中的ast.literal_eval(line) data = json.loads(line.strip()) print(data['events'])
数据示例(中文翻译版)
['{"事件": {"类别": "事件", "MAC地址": "123456", "站点": "HSTH"}}']
内容的提问来源于stack exchange,提问作者user17033672
相关产品推荐
相关产品推荐

