Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何生成用于查找具有9个前导零的哈希的计数器_Python_Multithreading_Hash_Mining - Fatal编程技术网

Python 如何生成用于查找具有9个前导零的哈希的计数器

Python 如何生成用于查找具有9个前导零的哈希的计数器,python,multithreading,hash,mining,Python,Multithreading,Hash,Mining,我正在尝试创建一个函数,该函数将使用带有9个前导零的sha1算法生成哈希。散列是基于一些随机数据的,就像在并发挖掘中一样,我只想在散列函数中使用的字符串中添加1 为了更快,我使用Pool类中的map()使它在我的所有内核上运行,但是如果我传递的块大于范围(9999999),则会出现问题 我想创建一个类似于全局计数器的东西,以便在函数运行多线程时将其输入函数,但如果我尝试range(sys.maxsize),我会得到一个MemoryError(我知道,因为我没有足够的RAM,很少有),但我想将ra

我正在尝试创建一个函数,该函数将使用带有9个前导零的sha1算法生成哈希。散列是基于一些随机数据的,就像在并发挖掘中一样,我只想在散列函数中使用的字符串中添加1

为了更快,我使用Pool类中的map()使它在我的所有内核上运行,但是如果我传递的块大于范围(9999999),则会出现问题

我想创建一个类似于全局计数器的东西,以便在函数运行多线程时将其输入函数,但如果我尝试range(sys.maxsize),我会得到一个MemoryError(我知道,因为我没有足够的RAM,很少有),但我想将range()生成的列表拆分为块。
这是可能的还是我应该尝试另一种方法?

您好,欢迎来到stackoverflow

首先,是的,可以使用全局计数器。例如,使用传递给工人的a或a。但是,从全局计数器获取新的数字将导致锁定(并可能等待)计数器。这可以而且应该避免,因为您需要进行大量的反查询。下面我建议的解决方案通过安装几个本地计数器来避免全局计数器,这些计数器就像单个全局计数器一样协同工作

关于代码的RAM消耗,我发现两个问题:

  • computesha
    在大多数情况下返回一个
    None
    值。这将进入由
    map
    创建的迭代器(即使您没有指定
    map
    的返回值)。这意味着迭代器比需要的大得多
  • 一般来说,进程的RAM在进程完成后被释放。您的进程启动了许多任务,这些任务都保留了自己的内存。一种可能的解决方案是
    maxstasksperchild
    选项(请参阅的文档)。当您将此选项设置为1000时,它会在完成1000个任务后关闭进程并创建一个新的进程,从而释放内存

  • 但是,我想提出一个解决这两个问题的不同的解决方案,它对内存非常友好,运行速度更快(就像我在NGreat之后),然后考虑到<代码>接受< /代码>这个答案,@ aligabiRelaMy.
    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)))