with open(filename, "rb") as f:
  1. f.read() 读取整个文件,通常将文件内容放到一个字符串变量中;
  2. f.readline() 次读取一行内容;
  3. 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

总结

  1. 后端分片的话可以考虑多线程,多进程的处理方案
  2. 但是一般业务场景 更多是前端上传的文件流的形式
  3. 更好的方案是前端拆分大文件,后端在接受文件的同时算出md5

python读取大文件md5校验性能优化比较相关推荐

  1. python读取大文件-python如何读取大文件以及分析时的性能优化小技巧

    在二代.三代测序背景下,分析人员难免会遇到解析超过1G.或者10G以上的文件.这里将给大家简单介绍下如何用python读取大文件,并给大家提两个优化代码的小建议. 首先,python 读取GB级大文件 ...

  2. python读取大文件性能_强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  3. python读取大文件-使用Python读取大文件的方法

    背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...

  4. python 读取大文件

    python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...

  5. Python读取大文件的坑与内存占用检测

    Python读取大文件的"坑"与内存占用检测 1.read()与readlines() with open(file_path, 'rb') as f:sha1Obj.update ...

  6. python读取大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  7. python读文件代码-简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...

  8. PHP 与Python 读取大文件的区别

    php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...

  9. python 实现大文件md5值计算

    参考:python 实现大文件md5值计算_ddw6022的博客-CSDN博客 python比较两个文本文件是否相同 - douzujun - 博客园 用python 正确计算大文件md5 值 - P ...

最新文章

  1. React学习笔记7:React使用注意事项
  2. jmeter--轻量级接口自动化测试框架
  3. java 词频_java程序:统计单词词频,
  4. eclipse编码页面中文乱码在哪更改编码?
  5. Mac bower install bootstrap bug解决
  6. Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起
  7. 10款非常有效的帮助你设计超酷响应式布局的jQuery插件
  8. 在eclipse中引入jquery.js文件报错的解决方案
  9. C++之 伪随机数的生成
  10. 由查找算法工程的类图分析组合模式
  11. windows版redis安装教程
  12. 文件服务器实验报告,Server 2008 R2 文件服务器资源管理器实验报告.docx
  13. Zblog主题,Zblog响应式主题,免费Zblog主题
  14. 微信小程序性能优化总结
  15. ESD静电二极管封装规格,详细介绍
  16. 电信系统服务器地址,中国电信专线dns服务器地址!DNS
  17. VMware虚拟机启动错误(正在被占用、内部错误)等问题
  18. cubieboard2 android,在cubieboard2双卡版上从零构建Android4.2.2系统
  19. IDEA-自定义常用代码块
  20. 风剑分享“站在上帝视角看数据”,点燃企业大数据梦想与思潮

热门文章

  1. 掌握IDEA的这两款插件,写“破解补丁”分分钟
  2. layui下拉框联动查询效果
  3. “跟消费谈恋爱,跟科技结婚”,汤臣倍健开启VDS新周期
  4. 求求你别再写上千行的类了,试试 IDEA 这些牛逼的重构技巧吧
  5. SparkMlib 之随机森林及其案例
  6. Nginx + ModSecurity 报错
  7. tcl/tk参考——tcl内建命令
  8. 测试人员与开发人员的比例究竟多少是合理的?
  9. Android项目开发:指南针(两种方法实现)
  10. 同期群分析(Cohort Analysis)