You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归处理大文件问题:递归后结果未改变求解决

问题分析与解决

递归无效的核心原因

你写的递归代码没有处理递归调用的返回值,只是单纯调用了cls.get_unique_measuring_point_ids(times - 1),但没把递归得到的结果和当前批次的结果合并。所以不管递归多少次,最终返回的都是第一次遍历cls.ndw_events得到的唯一ID列表,结果自然不会变化。

修正后的递归代码(仅解决递归逻辑问题)

如果只是想让递归逻辑生效,可以改成用集合自动去重,并合并递归返回的结果:

@classmethod
def get_unique_measuring_point_ids(cls, times):
    # 用集合存储,自动去重,比列表+unique_everseen更高效
    measuring_point_ids = set()

    # 递归终止条件
    if times == 0:
        return list(measuring_point_ids)

    # 提取当前批次的ID
    for event in cls.ndw_events:
        measuring_point_ids.add(event["measuring_point_id"]["uuid"])
    
    # 合并递归调用返回的后续批次结果
    measuring_point_ids.update(cls.get_unique_measuring_point_ids(times - 1))
    
    return list(measuring_point_ids)

重要提醒:递归不适合提升大文件处理效率

你想用递归提升大文件处理效率的思路是错误的——当前代码里每次递归都在重复遍历同一个cls.ndw_events,这只会增加额外的函数调用开销,反而降低效率。

处理超大XML/JSON文件的正确姿势是分块解析,避免一次性把整个文件加载到内存。比如用ijson库逐节点解析JSON,每处理一部分数据就存入数据库,减少内存占用:

import ijson

@classmethod
def process_large_data(cls, json_file_path):
    unique_ids = set()
    batch_size = 1000  # 每积累1000个ID就存入数据库

    with open(json_file_path, 'rb') as f:
        # 逐节点解析events,不用加载整个文件到内存
        for event in ijson.items(f, 'ndw_events.item'):
            unique_ids.add(event["measuring_point_id"]["uuid"])
            
            # 达到批次大小就批量入库
            if len(unique_ids) >= batch_size:
                cls.save_to_database(unique_ids)
                unique_ids.clear()
        
        # 处理最后剩余的ID
        if unique_ids:
            cls.save_to_database(unique_ids)

内容的提问来源于stack exchange,提问作者kemal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:50