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的Django框架中实现Hacker News的一些功能
这篇文章主要介绍了在Python的Django框架中实现Hacker News的一些功能,包括投票“顶”评论等功能,需要的朋友可以参考下2015-04-04探索Python Furl高性能URL构建解析和操作功能实例
本文将提供关于Python Furl的全面指南,包括安装和配置、基本概念、URL解析、URL构建、查询参数操作、片段处理、实际应用场景以及丰富的示例代码2024-01-01conda创建环境过程出现"Solving environment: failed"报错的详细解
很长一段时间没用conda了,然后突然使用conda创建环境报错,所以下面这篇文章主要给大家介绍了关于conda创建环境过程出现"Solving environment: failed"报错的详细解决方法,需要的朋友可以参考下2022-11-11
最新评论