如何找到在大型文件系统重复文件,同时避免的MemoryError(How to find dupli

2019-10-23 00:11发布

我试图避免在我收集的MP3复制(很大)。 我想通过检查文件内容,而不是寻找相同的文件名重复检查。 我已经写了下面的代码要做到这一点,但它后约一分钟抛出一个的MemoryError。 我如何能得到这个任何建议工作?

import os
import hashlib

walk = os.walk('H:\MUSIC NEXT GEN')

mySet = set()
dupe  = []

hasher = hashlib.md5()

for dirpath, subdirs, files in walk:
    for f in files:
        fileName =  os.path.join(dirpath, f)
        with open(fileName, 'rb') as mp3:
            buf = mp3.read()
            hasher.update(buf)
            hashKey = hasher.hexdigest()
            print hashKey
            if hashKey in mySet:
                dupe.append(fileName)
            else:
                mySet.add(hashKey)


print 'Dupes: ' + str(dupe)

Answer 1:

你可能有无法立刻像你尝试读取一个巨大的文件mp3.read() 阅读更小的部分替代。 把它变成一个可爱的小功能也有助于保持你的主程序干净。 下面是我自己使用了一段时间了,现在的功能(稍稍打磨现在)为可能与你相似的工具:

import hashlib

def filehash(filename):
    with open(filename, mode='rb') as file:
        hasher = hashlib.md5()
        while True:
            buffer = file.read(1 << 20)
            if not buffer:
                return hasher.hexdigest()
            hasher.update(buffer)

更新 :一个readinto版本:

buffer = bytearray(1 << 20)
def filehash(filename):
    with open(filename, mode='rb') as file:
        hasher = hashlib.md5()
        while True:
            n = file.readinto(buffer)
            if not n:
                return hasher.hexdigest()
            hasher.update(buffer if n == len(buffer) else buffer[:n])

随着内存和十次已缓存1GB的文件,则此花平均5.35秒。 在read版本,平均需6.07秒。 在这两个版本中,Python进程在运行过程中占据约10MB RAM。

我可能会坚持使用read版本,因为我喜欢它的简单性和因为在我的实际使用情况下,数据是不是已经在RAM中缓存,我使用SHA256(所以总的时间上升显著,使的一点优势readinto更不相关)。



Answer 2:

hasher.update追加内容到前面。 您可能希望创建一个新的hasher为每个文件



文章来源: How to find duplicate files in large filesystem whilst avoiding MemoryError