MST

星途 面试题库

面试题:Python生成器与迭代器在处理大规模数据时的优化策略

假设你需要处理一个非常大的文本文件(例如10GB),文件中每行是一个JSON格式的字符串。要求使用Python的生成器和迭代器技术,逐行读取文件内容,解析JSON数据,并对解析后的数据进行一些计算(例如统计某个字段的总和)。阐述在这个过程中如何利用生成器和迭代器避免一次性加载整个文件到内存,提高程序的性能和稳定性。请给出完整的代码实现,并分析每一步的内存使用和性能优化点。
35.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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}")


代码分析

  1. read_large_json_file 函数
    • 内存使用:此函数使用生成器,每次迭代只从文件中读取一行数据,并通过 yield 返回解析后的JSON数据。这意味着在任何时刻,内存中只保存当前行的数据,而不是整个文件,大大减少了内存占用。
    • 性能优化点:使用生成器延迟计算,只有在需要数据时才进行读取和解析,避免了一次性加载大文件到内存的开销。同时,with open 语句确保文件在使用完毕后正确关闭,提高了资源管理效率。
  2. calculate_sum 函数
    • 内存使用:通过迭代生成器 read_large_json_file(file_path),每次处理一个解析后的JSON对象,不会在内存中积累大量数据。变量 total 只保存当前统计的总和,内存占用稳定。
    • 性能优化点:直接在迭代生成器的过程中进行计算,避免了将所有解析后的数据存储在一个列表或其他数据结构中,进一步减少了内存使用。整个过程逐行处理,对于大文件来说性能更优。