我想为我丢失的密码字母生成所有可能的组合。
我选择 itertools.combinations 而不是 itertools.products,因为它产生大约 4% 的后者,而且速度很快,但运行后我的代码会因为内存不足而被杀死。
def genb(lst, word_length):
with concurrent.futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
comb = ("".join(combination) for combination in itertools.combinations(lst, word_length))
for future in concurrent.futures.as_completed(executor.submit(combine, comb)):
result = future.result()
if result:
return result
return False
有没有办法减少上面代码的内存使用? 我有 256GB 的 RAM 和 64 个线程在运行。
此内存问题与
combinations()
调用无关,后者仅使用少量固定内存量。
相反,问题是由并发期货实例过多引起的。
一个可能的解决方案是只创建少数期货(每个期货运行一个单独的核心)并提交成批的密码尝试来评估。