import json
def parse_json_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
try:
yield json.loads(line)
except json.JSONDecodeError:
continue
def filter_data(json_generator, condition):
for data in json_generator:
if condition(data):
yield data
def calculate_data(filtered_generator):
total = 0
for data in filtered_generator:
# 假设这里进行某个计算,例如假设JSON数据中有个 'value' 字段,计算其总和
if 'value' in data:
total += data['value']
return total
# 使用示例
file_path = 'your_large_file.txt'
json_generator = parse_json_file(file_path)
filtered_generator = filter_data(json_generator, lambda x: 'key' in x)
result = calculate_data(filtered_generator)
print(result)
优化内存思路
- 使用生成器读取文件:
parse_json_file
函数中,使用 with open
逐行读取文件,而不是一次性将整个文件读入内存。yield json.loads(line)
使得每次只返回一个解析后的JSON对象,而不是将所有解析后的对象存储在一个大列表中。这样在处理大量数据时,内存中始终只保存当前处理的那一行数据解析后的结果,大大减少了内存占用。
- 使用生成器进行数据筛选:
filter_data
函数接收一个生成器 json_generator
,并通过 yield
返回满足条件的数据。它不会将所有筛选后的数据存储在一个数据结构中,而是逐个生成,同样避免了一次性在内存中保存大量筛选后的数据。
- 使用迭代器进行计算:
calculate_data
函数接收筛选后的生成器 filtered_generator
,在循环中对数据进行计算。由于是迭代处理,不需要将所有筛选后的数据存储起来再进行计算,在计算过程中内存中只保存当前处理的数据和计算的中间结果(如 total
),进一步优化了内存使用。