我试图避免在我收集的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)
你可能有无法立刻像你尝试读取一个巨大的文件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
更不相关)。
hasher.update
追加内容到前面。 您可能希望创建一个新的hasher
为每个文件
文章来源: How to find duplicate files in large filesystem whilst avoiding MemoryError