Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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多处理imap块大小_Python_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python多处理imap块大小

Python多处理imap块大小,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,我想比较所有子文件夹中具有相同路径结构和相同文件的两个文件夹。该文件夹相当大,大小约为80GB,文件号为8000 我想确保两个顶级目录下的每个对应文件对具有相同的md5校验和值。我编写了一个简单的树DFS函数,搜索两个目录下的所有文件,根据文件大小对它们进行排序,并将它们存储在两个列表中 当我遍历这些列表时,我发现进行所有比较非常耗时,CPU使用率也很低 我认为多处理模块对这种情况是有好处的。这是我的多处理实现: from multiprocessing import Pool, cpu_cou

我想比较所有子文件夹中具有相同路径结构和相同文件的两个文件夹。该文件夹相当大,大小约为80GB,文件号为8000

我想确保两个顶级目录下的每个对应文件对具有相同的md5校验和值。我编写了一个简单的树DFS函数,搜索两个目录下的所有文件,根据文件大小对它们进行排序,并将它们存储在两个列表中

当我遍历这些列表时,我发现进行所有比较非常耗时,CPU使用率也很低

我认为多处理模块对这种情况是有好处的。这是我的多处理实现:

from multiprocessing import Pool, cpu_count
import hashlib

def calc_md5(item):
    m = hashlib.md5()
    with open(item, 'rb') as f:
        for chunk in iter(lambda: f.read(4096), b""):
            m.update(chunk)
    return m.hexdigest()

def worker(args):
    a, b = args
    return calc_md5(a) == calc_md5(b)

def multi_compare(queue_a, queue_b, thread):
    pool = Pool(processes = cpu_count() - 1)
    # Task iterable
    task = zip(queue_a, queue_b)
    # Multiprocessing
    for retval in pool.imap_unordered(worker, task, chunksize = 5):
        if not retval:
            print "Bad Detected"
这里,队列a和队列b是要比较的文件路径,它们根据文件大小排序。我期望这种多处理方法能带来更高的CPU使用率和更好的性能,但事实似乎并非如此。虽然简单的顺序迭代大约需要3200秒才能完成,但多处理方法大约需要4600秒

我很好奇为什么会这样?这是使用多处理的好方法吗?在我的代码中,这种糟糕性能的瓶颈是什么?有什么办法可以改进吗

编辑: 我已经根据我的直觉设置了块大小。我想我可以将其更改为队列a或队列b的长度(按线程编号划分),并将任务队列排序为包含队列a[0::thread]或队列b[0::thread]元素的前1/4,反之亦然。这将为所有线程提供相似大小的任务,并使所有线程始终处于繁忙状态。我不知道这是否是一个获得额外性能的好方法,我仍在对此进行测试

编辑: 上述编辑中的测试需要4000秒才能完成。略优于chunksize=5。比串行方法更糟糕。 所以我想问一下,如何确定这个多处理程序的瓶颈


谢谢大家!

是IO限制了性能。 MD5算法现在对于CPU来说太容易了。 以下代码以GB/s为单位计算MD5性能

import time
import hashlib
from multiprocessing import Pool

def worker(x):
    data = bytearray(xrange(256)) * 4 * 1024
    md5 = hashlib.md5()
    for x in xrange(1024):
        md5.update(data)

if __name__ == '__main__':
    num_workers = 4
    pool = Pool(num_workers)
    start = time.time()
    pool.map(worker, xrange(num_workers))
    print num_workers / (time.time() - start), 'Gb/s'
相对较弱的intel现代移动i3 CPU(2核,4线程) 能够以每秒1 Gb的速率散列。将此与 这是600 Mb/s。 因此,即使使用SSD,磁盘接口也会限制哈希速度。
在硬盘上,情况更糟。 多个读卡器将迫使磁盘移动其读取头,从而导致比仅使用一个读卡器线程时更多的延迟。 这就像读取一个碎片严重的文件。

当数据集不是那么大时,操作系统的文件缓存会有很大帮助。但这不是你的情况。

你的文件在硬盘上吗?大多数HDD在多线程读取方面都不好,因为搜索速度慢。@robyschek是的,我想我是在HDD PC上。我将使用SSD测试它,然后查看。谢谢