Python生成大量排列内存溢出,读取存储内容转列表报错求助
解决方案
一、修正写入逻辑(避免内存溢出+规范格式)
原代码同时将排列存入列表action_list和文件,这依然会触发内存溢出,应该只写入文件,放弃列表存储。同时调整写入格式,让后续解析更简单:
from itertools import permutations, product import numpy as np # 用with语句自动管理文件,避免资源泄漏 with open("comb3.txt", "w") as text_file: UEs = [[4,5,6],[1,2,3]] List_UE = [list(p) for p in product(*UEs)] comb = permutations(List_UE, 3) for i in comb: # 检查排列中元素是否唯一(保留原逻辑) unique_elements, counts = np.unique(list(i), return_counts=True) if all(counts == 1): # 每个排列单独占一行,用repr生成可直接解析的字符串格式 text_file.write(repr(list(i)) + "\n")
二、正确读取并转换为列表
场景1:需要加载全部排列到内存(总数可控时)
import ast action_list = [] with open("comb3.txt", "r") as file: for line in file: # 去掉换行符后解析为列表 perm = ast.literal_eval(line.strip()) action_list.append(perm) # 现在action_list就是列表的列表,可直接使用 print(action_list[0])
场景2:随机选取单个排列(无需加载全部,彻底解决内存溢出)
如果排列数量极大,不需要全部加载,直接随机选一行解析:
import ast import random def get_random_permutation(file_path): # 先统计文件行数(即排列总数) with open(file_path, "r") as f: line_count = sum(1 for _ in f) # 随机选目标行 target_line = random.randint(0, line_count - 1) with open(file_path, "r") as f: for idx, line in enumerate(f): if idx == target_line: return ast.literal_eval(line.strip()) # 使用示例 random_perm = get_random_permutation("comb3.txt") print(random_perm)
三、原错误原因解析
- 写入格式错误:原代码每个排列后加逗号,最终文件末尾会多出一个无效逗号,导致
ast.literal_eval解析时触发语法错误。 - 读取逻辑错误:
readlines()返回的是每行组成的列表,直接拼接成[content]会生成格式完全错误的字符串,不符合Python列表语法,无法被解析。
内容的提问来源于stack exchange,提问作者Salwa Mostafa
相关产品推荐
相关产品推荐

