python读取大文件md5校验性能优化比较
with open(filename, "rb") as f:
- f.read() 读取整个文件,通常将文件内容放到一个字符串变量中;
- f.readline() 次读取一行内容;
- f.readlines() 一次性读取所有内容并按行返回list;
当读取的文件较大时,全部读取内存中,会导致内存溢出
第一种:readline()
def md5_sum(filename):with open(filename, "rb") as f:f.seek(0)line = f.readline()md5 = hashlib.md5()md5.update(line)while line:line = f.readline()md5.update(line)f_md5 = md5.hexdigest()print(f_md5)return f_md5
我以一个1.4G的文件进行测试
4dcafe2e69d6d0a8979cb4eb7c26c3fd
耗时: 6.345685958862305
Current memory usage is 0.008476MB; Peak was 5.260233MB
耗时 6s,峰值内存占用5.2M
第二种:readlines()
def md5_sum2(filename):with open(filename, "rb") as f:f.seek(0)md5 = hashlib.md5()for line in f.readlines():md5.update(line)f_md5 = md5.hexdigest()print(f_md5)return f_md5
一次性将文件读到内存中,如果内存不够会报错
4dcafe2e69d6d0a8979cb4eb7c26c3fd
耗时: 7.258216857910156
Current memory usage is 0.008476MB; Peak was 1654.899472MB
耗时 7.2s,峰值内存占用1654M
反而速度更慢!
第三种:read()
def md5_sum3(filename):def chunked_file_reader(file, block_size=1024 * 16):"""生成器函数:分块读取文件内容,使用 iter 函数"""# 首先使用 partial(fp.read, block_size) 构造一个新的无需参数的函数# 循环将不断返回 fp.read(block_size) 调用结果,直到其为 '' 时终止for chunk in iter(partial(file.read, block_size), b''):yield chunkwith open(filename, "rb") as f:f.seek(0)md5 = hashlib.md5()for line in chunked_file_reader(f):md5.update(line)f_md5 = md5.hexdigest()print(f_md5)return f_md5
利用read block_size读取大小限制,构造生成器
4dcafe2e69d6d0a8979cb4eb7c26c3fd
耗时: 3.0910959243774414
Current memory usage is 0.014733MB; Peak was 0.053139MB
耗时 3,峰值内存占用0.05M
第四种:read() + itertools
def md5_sum4(filename):buffer = 1024 * 1024with open(filename, "rb") as f:buf_gen = takewhile(lambda x: x, (f.read(buffer) for _ in repeat(None)))md5 = hashlib.md5()for line in buf_gen:md5.update(line)f_md5 = md5.hexdigest()print(f_md5)return f_md5
itertools 有更好的for loop 性能
这里切片大小设置为 1024*1024
4dcafe2e69d6d0a8979cb4eb7c26c3fd
耗时: 2.7328171730041504
Current memory usage is 0.00074MB; Peak was 2.103334MB
耗时 2.7s,峰值内存占用2.1M
总结
- 后端分片的话可以考虑多线程,多进程的处理方案
- 但是一般业务场景 更多是前端上传的文件流的形式
- 更好的方案是前端拆分大文件,后端在接受文件的同时算出md5
python读取大文件md5校验性能优化比较相关推荐
- python读取大文件-python如何读取大文件以及分析时的性能优化小技巧
在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...
- python读取大文件性能_强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读取大文件-使用Python读取大文件的方法
背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...
- python 读取大文件
python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...
- Python读取大文件的坑与内存占用检测
Python读取大文件的"坑"与内存占用检测 1.read()与readlines() with open(file_path, 'rb') as f:sha1Obj.update ...
- python读取大文件-强悍的Python读取大文件的解决方案
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...
- python读文件代码-简单了解Python读取大文件代码实例
这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...
- python 实现大文件md5值计算
参考:python 实现大文件md5值计算_ddw6022的博客-CSDN博客 python比较两个文本文件是否相同 - douzujun - 博客园 用python 正确计算大文件md5 值 - P ...
最新文章
- React学习笔记7:React使用注意事项
- jmeter--轻量级接口自动化测试框架
- java 词频_java程序:统计单词词频,
- eclipse编码页面中文乱码在哪更改编码?
- Mac bower install bootstrap bug解决
- Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起
- 10款非常有效的帮助你设计超酷响应式布局的jQuery插件
- 在eclipse中引入jquery.js文件报错的解决方案
- C++之 伪随机数的生成
- 由查找算法工程的类图分析组合模式
- windows版redis安装教程
- 文件服务器实验报告,Server 2008 R2 文件服务器资源管理器实验报告.docx
- Zblog主题,Zblog响应式主题,免费Zblog主题
- 微信小程序性能优化总结
- ESD静电二极管封装规格,详细介绍
- 电信系统服务器地址,中国电信专线dns服务器地址!DNS
- VMware虚拟机启动错误(正在被占用、内部错误)等问题
- cubieboard2 android,在cubieboard2双卡版上从零构建Android4.2.2系统
- IDEA-自定义常用代码块
- 风剑分享“站在上帝视角看数据”,点燃企业大数据梦想与思潮