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
相关产品推荐
相关产品推荐

