MST

星途 面试题库

面试题:Python生成器与迭代器在复杂数据处理中的内存优化

假设有一个包含大量(百万级)数据的文本文件,每行数据是一个复杂的JSON格式字符串,需要对这些数据进行解析、筛选和一些计算操作,要求尽量减少内存占用。请使用Python的生成器和迭代器实现这个处理过程,并说明每一步优化内存的思路。
44.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

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

优化内存思路

  1. 使用生成器读取文件
    • parse_json_file 函数中,使用 with open 逐行读取文件,而不是一次性将整个文件读入内存。yield json.loads(line) 使得每次只返回一个解析后的JSON对象,而不是将所有解析后的对象存储在一个大列表中。这样在处理大量数据时,内存中始终只保存当前处理的那一行数据解析后的结果,大大减少了内存占用。
  2. 使用生成器进行数据筛选
    • filter_data 函数接收一个生成器 json_generator,并通过 yield 返回满足条件的数据。它不会将所有筛选后的数据存储在一个数据结构中,而是逐个生成,同样避免了一次性在内存中保存大量筛选后的数据。
  3. 使用迭代器进行计算
    • calculate_data 函数接收筛选后的生成器 filtered_generator,在循环中对数据进行计算。由于是迭代处理,不需要将所有筛选后的数据存储起来再进行计算,在计算过程中内存中只保存当前处理的数据和计算的中间结果(如 total),进一步优化了内存使用。