Python的hashlib库获取超大文件的md5值实例探究
Python hashlib获取文件md5值
不知道大家在工作中有没有涉及到超大文件的读取,在处理超大文件时,如果直接将整个文件读到内存,然后再计算MD5值可能会占用大量内存,严重的情况下可能会导致系统故障。
为了减轻系统内存压力,我们通常采取分块读取文件内容的方式来计算MD5。
Python的hashlib库,它支持将大文件分块读取并计算MD5值,从而避免一次性加载整个文件到内存中。
import hashlib
import os
def get_file_md5(file_path, block_size=2 ** 20): # 默认块大小为1MB
md5_hash = hashlib.md5()
with open(file_path, "rb") as f:
while True:
data = f.read(block_size)
if not data:
break
md5_hash.update(data)
return md5_hash.hexdigest()
# 使用方法
file_path_large_file = r"E:\xxxxxxx\Win10_64位专业版本.ISO"
md5_value = get_file_md5(file_path_large_file)
print(f"大文件的大小是:{os.path.getsize(file_path_large_file)/1024/1024/1024:.2f}GB")
print(f"大文件的MD5值是:{md5_value}") 测试5.42G操作系统文件
我自己找了一个5.42G操作系统文件来测试了下,运行过程计算机内存的使用率并没有明显增加,表现很平稳。


内存利用率变化
可能大家看到这里不能明显感受到分块读取文件和一次性将大文件读入内存的差异,我下面的函数去掉了分块读取的设置,我们再来看下内存利用率的变化
def get_file_md52(file_path): # 这里去掉了块大小的设置
md5_hash = hashlib.md5()
with open(file_path, "rb") as f:
while True:
data = f.read() # 这里是一次性将文件读入内存
if not data:
break
md5_hash.update(data)
return md5_hash.hexdigest()
# 使用方法
file_path_large_file = r"E:\xxxxxx\Win10_64位专业版本.ISO"
md5_value = get_file_md52(file_path_large_file)
print(f"大文件的大小是:{os.path.getsize(file_path_large_file)/1024/1024/1024:.2f}GB")
print(f"大文件的MD5值是:{md5_value}")

通过上面的内存利用率截图,我们可以看到如果不设置分块读取,内存利用率会明显升高,在工作中这种操作会存在较大风险,所以,各位同学应该尽量避免这种操作方式。
当然了,分块读取超大文件的操作,不仅适用于计算md5值,同样可以用在其他读取文件内容的场景。希望各位同学可以灵活使用。
以上就是Python的hashlib库获取超大文件的md5值实例探究的详细内容,更多关于Python hashlib获取文件md5值的资料请关注脚本之家其它相关文章!
相关文章
Python有关Unicode UTF-8 GBK编码问题详解
本文主要介绍了Python有关Unicode UTF-8 GBK编码问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08
python机器学习使数据更鲜活的可视化工具Pandas_Alive
今天我分享大家一款非常棒的动画可视化工具:Pandas_Alive,它以 matplotlib 绘图为后端,不仅可以创建出令人惊叹的动画可视化,而且使用方法非常简单。本文详情如下2021-11-11


最新评论