【问题标题】:Python bottlenecks; Determining optimum chunk size for a file comparison functionPython 瓶颈;确定文件比较函数的最佳块大小
【发布时间】:2011-12-19 19:59:50
【问题描述】:

我正在编写一个文件比较函数。我知道filecmp.cmp,但在我的数据集中,预计很多文件都是相同的,所以我认为与其比较每个潜在的匹配项,不如实现一个可以比较它们的多文件比较一次全部。 (另外,由于我是 python 新手,我认为这是一个很好的学习练习。)它似乎进展顺利。到目前为止,事实上,通过一些输入,它比 unix 的 cmp 更快(这实际上让我有点担心,因为我不太相信这是可能的,因此认为我的实现可能有问题!)

所以,我已经编写了代码,但我现在正在尝试确定每次读取的理想块大小。我的一部分认为检索到的数据无论如何都必须进行比较,所以我一次能进入内存的次数越多越好,但我想知道 Python 数据结构是否存在可能会影响到这一点的限制。例如,我正在维护可能很大的块列表,并使用键是读取块的字典。

那么,我应该在 python 内置数据结构中注意哪些可能会影响这一点,或者这是否只能由硬件确定,应该通过在特定机器上进行分析来确定?


读回来我意识到这不是最明确的问题,但(尽管尝试)我不知道如何澄清它。如果这样可以使事情更清楚,我很乐意发布我的代码,但它比您的平均代码示例要长一点(虽然不是太糟糕)。如果需要进一步澄清,请发表评论。

谢谢。


更新重新。 SHA1: 我仅在 2 个相同的输入文件上测试了我的算法与 SHA1 的对比(实际数据中预计会更多),每个文件运行 100 次。我意识到这不是一个彻底的测试,但结果不同,值得评论。

(在任何一次测试中,计算机都没有承受任何其他负载,尽管我在 cmets 中说过,这不是在目标计算机上运行,​​而是在具有相当合理规格的计算机上运行。两者都测试有可能在两个线程中运行;也就是说 SHA1 发生在两个线程中,并且为我启动了两个线程,但由于实现,只有一个线程会被使用。单线程 SHA1 版本需要更长的时间。两个测试都读取一次相同大小的块。给出三组结果。)

现在我很困惑。 cmets (re. SHA1) 对吗?因此,这表示执行错误还是发生了其他事情?

SHA1:

real    5m35.865s    6m17.737s    5m57.010s
user    10m18.963s   11m34.178s   10m58.760s
sys     0m47.030s    0m52.707s    0m47.807s

我的:

real    3m47.185s    4m31.548s    4m40.628s
user    2m47.849s    3m26.207s    3m36.013s
sys     0m59.193s    1m5.139s     1m4.406s

【问题讨论】:

  • 你只想知道哪些文件是相等的吗?还是您需要有关差异的详细信息?如果是前者,只需比较文件的 SHA1 哈希值即可。
  • 如果 SHA1 太慢并且您不需要加密安全性,则使用另一个校验和。
  • @SvenMarnach,我只需要知道它们是否相等,但可能会有大量相同的大文件,我认为这样做可以避免计算开销每个文件的哈希值(以及极不可能发生哈希冲突的可能性!)
  • @agf:在我的机器上,计算一个 SHA1 至少比从磁盘读取快一百倍,所以这永远不会成为瓶颈。
  • @tjm:与从磁盘读取文件的成本相比,计算文件 SHA1 的成本完全可以忽略不计。 SHA1 哈希是 160 位。您将永远不会遇到哈希冲突。

标签: python performance optimization data-structures python-3.x


【解决方案1】:

我建议您使用binary search 方法来选择大小值。

从一个较大的值(您知道它太大)开始,然后将其减半。如果更快,请再次减少一半。如果速度较慢,请转到下一个半间隔。继续,直到达到最佳值。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2019-10-09
    • 2018-12-04
    相关资源
    最近更新 更多