我正在尝试创建一个函数,它将使用带有9个前导零的sha1算法生成哈希。散列是基于一些随机数据的,就像在并发挖掘中一样,我只想在哈希函数中使用的字符串中添加1。在
为了更快,我使用了Pool类中的map()使其在我所有的核心上运行,但是如果我传递的块大于range(999999999),我就有一个问题
def computesha(counter):
hash = 'somedata'+'otherdata'+str(counter)
newHash = hashlib.sha1(hash.encode()).hexdigest()
if newHash[:9] == '000000000':
print(str(newHash))
print(str(counter))
return str(newHash), str(counter)
if __name__ == '__main__':
d1 = datetime.datetime.now()
print("Start timestamp" + str(d1))
manager = multiprocessing.Manager()
return_dict = manager.dict()
p = Pool()
p.map(computesha, range(sys.maxsize) )
print(return_dict)
p.close()
p.join()
d2 = datetime.datetime.now()
print("End timestamp " + str(d2))
print("Elapsed time: " + str((d2-d1)))
我想创建一个类似于全局计数器的东西,当它运行多线程时,把它输入到函数中,但是如果我尝试range(系统最大大小)我得到一个MemoryError(我知道,因为我没有足够的内存,很少有内存),但是我想把range()生成的列表分成块。 这是可能的还是我应该尝试另一种方法?在
嗨,阿林,欢迎来到stackoverflow。在
首先,是的,全局计数器是可能的。E、 带有一个multiprocessing.Queue或一个multiprocessing.Value传递给工人的g。但是,从全局计数器获取一个新的数字将导致锁定(并可能等待)计数器。这是可以而且应该避免的,因为您需要进行大量的计数器查询。我在下面提出的解决方案是通过安装几个本地计数器来避免全局计数器,这些计数器就像一个全局计数器一样一起工作。在
关于代码的RAM消耗,我看到两个问题:
computesha
大多数时候返回一个None
值。这将进入由map
创建的迭代器(即使您没有指定map
的返回值)。这意味着迭代器比需要的大得多。在maxtasksperchild
选项(请参阅multiprocessing.pool.Pool的文档)。当您将此选项设置为1000时,它将在1000个任务之后关闭进程并创建一个新的进程,从而释放内存。在但是,我想提出一个不同的解决方案,它可以解决这两个问题,非常有利于内存并且运行速度更快(在N<;10次测试之后,我觉得是这样)作为带有
maxtasksperchild
选项的解决方案:此代码生成所需的
number_of_processes
,然后调用computesha
函数。如果number_of_processes=8
,则第一个进程计算计数器值[0,8,16,24,...]
的哈希值,第二个进程计算[1,9,17,25]
的哈希值,依此类推。在这种方法的优点是:在while循环的每次迭代中,}的内存可以重用,循环比函数便宜,只需调用
hash
和{number_of_processes
函数,而不感兴趣的结果则被简单地遗忘。在一个可能的缺点是,计数器是完全独立的,并且每个进程都将完成全部工作的
1/number_of_processes
,即使某些进程比其他进程快。最终,程序的速度和最慢的过程一样快。我没有测量,但我想这是一个相当理论上的问题。在希望有帮助!在
相关问题 更多 >
编程相关推荐