Python2.7 Aarch64环境运行itertools.combinations输出Killed问题求解
问题成因
- 组合数量级远超可处理范围:你用到的字符集共62个元素,取10个的组合数为
C(62,10) ≈ 1.47×10^13,就算每秒生成100万条,也需要400多年才能跑完所有组合,全量生成是不可能完成的任务。 - 进程被杀死的直接原因:你直接将所有组合打印到终端,终端会缓存所有历史输出内容,短时间内的巨量输出会快速占满系统内存,触发Linux的内存溢出杀手(OOM Killer)主动杀掉进程,就是你看到的
Killed提示。 - 额外风险:你代码里写的
rSubset函数非常危险,如果你调用它,会直接把所有组合一次性转为列表再转集合,相当于一次性把超大量数据加载到内存,会瞬间触发OOM,建议直接删除这段无用代码。
分块写入实现方案
可以通过循环搭配break实现你要的按批次生成写入的需求,不需要复杂逻辑,核心思路是内存中只保留当前批次的生成结果,写满一批就刷入磁盘清空缓存,同时可以设置最大生成量,达到阈值直接终止任务。
示例代码如下:
from itertools import combinations if __name__ == "__main__": # 字符集 char_set = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] # 密码长度 pwd_length = 10 # 每批次写入的条数,可根据内存大小调整,10万条约占1MB内存 batch_size = 100000 # 最大生成条数,设为0会一直生成(不建议,全量生成不可能完成) max_count = 1000000 current_batch = [] total = 0 with open("passwords.txt", "w", encoding="utf-8") as f: for item in combinations(char_set, pwd_length): # 把组合转为字符串格式,可根据需求修改拼接规则 pwd_str = ''.join(map(str, item)) current_batch.append(pwd_str + "\n") total += 1 # 达到批次大小就写入磁盘,清空缓存 if len(current_batch) >= batch_size: f.writelines(current_batch) current_batch = [] # 仅每批次打印一次进度,避免大量终端输出 print(f"已生成:{total} 条") # 达到最大生成量直接终止,用break实现需求 if max_count > 0 and total >= max_count: break # 写入最后不足一个批次的剩余内容 if current_batch: f.writelines(current_batch) print(f"任务完成,共生成 {total} 条密码,已写入 passwords.txt")
注意事项
- 不要设置过大的
batch_size,也不要删除每批次写入的逻辑,否则会导致内存占用持续升高最终被OOM杀死。 - 务必设置合理的
max_count,全量生成所有组合是不可能完成的任务,普通存储设备也装不下这么多数据。 - 不要每条结果都打印到终端,仅保留批次进度打印即可,避免终端占用过多内存。
内容的提问来源于stack exchange,提问作者ConfusingFool93
相关产品推荐
相关产品推荐

