用于在Brute强制中将大型Iterable分块的最有效方法

时间:2013-11-20 01:49:00

标签: python parallel-processing bigdata brute-force

我正在尝试开发一种方法来处理大型并行任务以强制执行密钥空间。我希望能够想出一种方法来传递一个worker值,使得给定一个块大小,该值将告诉工作输出什么。

简单地说:

给出一个charset(a-z)和一个最大legth为1(基本上是a-z)和一个块大小为5

如果我向工人1发送数字0然后它将需要0-4的迭代器,a,b,d,e,f)如果我发送工人2数字1它将需要5-9等我有该代码基本上有效:

#!/usr/bin/python

import itertools
maxlen = 5
charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

chunksize = 1000
chunkpart = 5


for s in  itertools.islice(itertools.chain.from_iterable((''.join(l) for l in itertools.product(charset, repeat=i))  for i in range(1, maxlen + 1)), chunksize*chunkpart, chunksize*(chunkpart + 1)):
    print s

好的,效果很好,如果我将chunkpart 5发送给worker 1,它将在该chunkpart上执行它需要做的事情。

当我需要获得一小块(1000条记录)但远远进入大型集合时,问题就会发挥作用。假设maxlen是10而chunkpart是50,000,000。 Python需要很长时间才能达到这一点。

所以,我想我知道为什么会发生这种情况,需要做一些数学计算才能弄清楚在迭代器中的位置;我想知道的是,有没有更好的方法让我做这个快捷方式?我的直觉告诉我,itertools有答案,我的大脑说你需要更好地理解itertools。

0 个答案:

没有答案