- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想比较两个具有相同路径结构和所有子文件夹中相同文件的文件夹。该文件夹相当大,大小约为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"
这里queue_a和queue_b是要比较的文件的路径,按照文件大小排序。我期望这种多处理方法具有更高的 CPU 使用率和更好的性能,但事实似乎并非如此。简单的顺序迭代大约需要 3200 秒才能完成,而多处理方法大约需要 4600 秒。
我很好奇为什么会出现这种情况?这是使用多处理的好点吗?我的代码中这种糟糕性能的瓶颈是什么?有什么办法可以改善吗?
编辑:我根据我的直觉设置了 block 大小。我想我可以将其更改为按线程号划分的queue_a或queue_b的长度,并将任务队列排序为包含queue_a[0::thread]或queue_b[0::thread]元素的前1/4,反之亦然。这会将相似大小的任务提供给所有线程,并使所有线程始终保持忙碌状态。我不知道这是否是获得额外性能的好方法,我仍在对此进行测试。
编辑:上述编辑中的测试需要 4000 秒才能完成。比 chunksize = 5 稍好。但仍比串行方法差。所以我想问一下如何确定这个多处理程序的瓶颈。
谢谢!
最佳答案
限制性能的是IO。现在,MD5 算法对于 CPU 来说是一项太简单的任务了。以下代码计算 MD5 性能(以 GB/s 为单位)。
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'
相对较弱的英特尔现代移动 i3 CPU(2 核,4 线程)能够以每秒 1 Gb 的速度进行哈希处理。将此与 SATA3 bandwidth即 600 Mb/s。因此,即使使用 SSD,磁盘接口(interface)也会限制哈希速度。
在硬盘上情况更糟。多个读取器将迫使磁盘移动其读取头,从而导致比仅使用一个读取器线程更多的延迟。这就像读取一个严重碎片化的文件。
当数据集不是那么大时,操作系统的文件缓存可以提供很大帮助。但这不是你的情况。
关于Python 多处理 imap chunksize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445763/
我有一堆代码执行 IMAP 命令“search, idle, done, search, idle, done, search, ...”。 是否有可能某些消息在搜索和空闲命令之间到达,因此只能在空闲
(使用IMAP命令,而不借助任何其他邮件程序包) 最佳答案 我不确定您对imap的了解程度如何,但是基本上在登录后,“选择”源邮箱,“复制”邮件,然后“删除”邮件(如果是,则“删除”旧邮箱)现在是空的
我正在编写一个 IMAP 爬虫,它是开源应用程序的一部分,对于增量爬网,我想使用消息 UID 来确定我是否已经看到了特定消息。 现在我找到了 a post从 2007 年开始说 IMAP UID 并不
我注意到 libcurl 支持 IMAP,但在文档和示例中没有找到任何内容 http://curl.haxx.se/libcurl/c/imap.html很穷。有谁知道如何在这个库中使用这个协议(pr
IMAP UID 是否保证为数字?我读过 RFC3501 中的部分,它说: Unique identifiers are assigned in a strictly ascending fashio
IMAP UID 是否保证为数字?我读过 RFC3501 中的部分,它说: Unique identifiers are assigned in a strictly ascending fashio
我正在使用开源 IMAP C# 库 IMapX (http://hellowebapps.com/products/imapx/)。当我试图从收件箱中获取电子邮件时,需要花费很多时间。有没有办法根据接
我正在尝试使用 Limilabs imap 库连接到电子邮件; tcpc = new System.Net.Sockets.TcpClient("imap.gmail.com", 993); 工作
我正在尝试使用 imap 方法通过 php 打开电子邮件,但它给我一个错误无法打开流 {imap.gmail.com:993/imap/ssl}INBOX,这是我的代码 $hostname = '{i
有没有办法确定给定电子邮件地址的 POP 或 IMAP 服务器?我正在为非技术用户构建一个应用程序,我真的不想打扰他们询问他们的 IMAP/POP 服务器。 mail2web.com这样做,但我不确定
如何确定通过 APPEND 添加的消息的 UID到邮箱?通过 STATUS我可以事先得到下一个值的预测,我可以 SEARCH之后,但依赖这些会引入竞争条件,因为可能在这些命令之间添加了其他消息。 最佳
这个搜索查询对我来说似乎有效: UID SEARCH OR ( OR ( OR (FROM "def@gmail.com") (FROM "abc@gmail.com")) (FROM "ghi@gm
我正在使用以下代码以编程方式验证电子邮件。 Properties properties = new Properties(); Session emailSession = Session.getDe
我正在使用 OpenSSL 连接到邮件服务器。 POP3 工作正常,但 IMAP 有问题。基于 CAPABILITY 命令服务器支持 PLAIN、NTLM 和 GSS-API 认证方法。 我想使用 P
我正在使用以下代码建立 IMAP 连接。我想阅读电子邮件。我读了这个文件 link无法从这里继续。 我的代码: #lang racket (define imap-server "*****") (d
在尝试使用 php 的 imap 函数时,我无法连接到 Gmail 的 imap 服务器。我正在使用: $mail = imap_open('{imap.gmail.com:993/imap/ssl/
我试图更好地理解 Gmail API . stated benefits 之一Gmail API 的最大特点是它可以“提供比 IMAP 显着的性能改进”。 Gmail API 和协议(protocol
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在制作一个支持 POP3 和 IMAP 的邮件客户端。我正在使用 vmime api 用 C++ 对客户端进行编程。我的问题是:同步邮件的最佳方式是什么? 我认为标识符是个好方法,但我不知道同步邮
我正在制作一个支持 POP3 和 IMAP 的邮件客户端。我正在使用 vmime api 用 C++ 对客户端进行编程。我的问题是:同步邮件的最佳方式是什么? 我认为标识符是个好方法,但我不知道同步邮
我是一名优秀的程序员,十分优秀!