面试题答案
一键面试import json
def read_large_json_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
yield json.loads(line)
def calculate_sum(file_path, target_field):
total = 0
for data in read_large_json_file(file_path):
if target_field in data:
total += data[target_field]
return total
你可以使用以下方式调用:
file_path = 'large_file.json'
target_field = 'your_field'
result = calculate_sum(file_path, target_field)
print(f"The sum of {target_field} is: {result}")
代码分析
read_large_json_file
函数:- 内存使用:此函数使用生成器,每次迭代只从文件中读取一行数据,并通过
yield
返回解析后的JSON数据。这意味着在任何时刻,内存中只保存当前行的数据,而不是整个文件,大大减少了内存占用。 - 性能优化点:使用生成器延迟计算,只有在需要数据时才进行读取和解析,避免了一次性加载大文件到内存的开销。同时,
with open
语句确保文件在使用完毕后正确关闭,提高了资源管理效率。
- 内存使用:此函数使用生成器,每次迭代只从文件中读取一行数据,并通过
calculate_sum
函数:- 内存使用:通过迭代生成器
read_large_json_file(file_path)
,每次处理一个解析后的JSON对象,不会在内存中积累大量数据。变量total
只保存当前统计的总和,内存占用稳定。 - 性能优化点:直接在迭代生成器的过程中进行计算,避免了将所有解析后的数据存储在一个列表或其他数据结构中,进一步减少了内存使用。整个过程逐行处理,对于大文件来说性能更优。
- 内存使用:通过迭代生成器