Python读取大文件与内存占用检测(常用的分步调试pdb)

2023-10-30

大文件读取问题

顺便记录一下vim的配置:https://blog.csdn.net/sinat_33741547/article/details/74781591

https://blog.csdn.net/zwbill/article/details/78475705

这个很简单但是这里重复写一下,主要是记录一下后面的内存检测和分部调试!!!

1.read()与readlines():

codes.open参考地址:https://blog.csdn.net/weay/article/details/80946152

随手搜索python读写文件的教程,很经常看到read()与readlines()这对函数。所以我们会常常看到如下代码:

with open(file_path, 'rb') as f:
    sha1Obj.update(f.read())

or

with open(file_path, 'rb') as f:
    for line in f.readlines():
        print(line)

这对方法在读取小文件时确实不会产生什么异常,但是一旦读取大文件,很容易会产生MemoryError,也就是内存溢出的问题。

####Why Memory Error?
我们首先来看看这两个方法:

当默认参数size=-1时,read方法会读取直到EOF,当文件大小大于可用内存时,自然会发生内存溢出的错误。
read方法

同样的,readlines会构造一个list。list而不是iter,所以所有的内容都会保存在内存之上,同样也会发生内存溢出的错误。
readlines方法

2.正确的用法:

在实际运行的系统之中如果写出上述代码是十分危险的,这种”坑“十分隐蔽。所以接下来我们来了解一下正确用,正确的用法也很简单,依照API之中对函数的描述来进行对应的编码就OK了:

如果是二进制文件推荐用如下这种写法,可以自己指定缓冲区有多少byte。显然缓冲区越大,读取速度越快。

with open(file_path, 'rb') as f:
    while True:
        buf = f.read(1024)
        if buf:    
            sha1Obj.update(buf)
        else:
            break

而如果是文本文件,则可以用readline方法或直接迭代文件(python这里封装了一个语法糖,二者的内生逻辑一致,不过显然迭代文件的写法更pythonic )每次读取一行,效率是比较低的。笔者简单测试了一下,在3G文件之下,大概性能和前者差了20%.

with open(file_path, 'rb') as f:
    while True:
        line = f.readline()
        if buf:    
            print(line)
        else:
            break

with open(file_path, 'rb') as f:
    for line in f:
        print(line)

内存检测工具:memory_profiler

对于python代码的内存占用问题,对于代码进行内存监控十分必要。这里笔者这里推荐两个小工具来检测python代码的内存占用。

####memory_profiler
首先先用pip安装memory_profiler

pip install memory_profiler

memory_profiler是利用python的装饰器工作的,所以我们需要在进行测试的函数上添加装饰器。

from hashlib import sha1
import sys

@profile
def my_func():
    sha1Obj = sha1()
    with open(sys.argv[1], 'rb') as f:
        while True:
            buf = f.read(10 * 1024 * 1024)
            if buf:
                sha1Obj.update(buf)
            else:
                break

    print(sha1Obj.hexdigest())


if __name__ == '__main__':
    my_func()

之后在运行代码时加上** -m memory_profiler**
就可以了解函数每一步代码的内存占用了
依次列出每一步代码的内存占用情况

 内存检测工具:guppy

依样画葫芦,仍然是通过pip先安装guppy

pip install guppy

之后可以在代码之中利用guppy直接打印出对应各种python类型(list、tuple、dict等)分别创建了多少对象,占用了多少内存。

from guppy import hpy
import sys


def my_func():
    mem = hpy()
    with open(sys.argv[1], 'rb') as f:
        while True:
            buf = f.read(10 * 1024 * 1024)
            if buf:
                print(mem.heap())
            else:
                break

如下图所示,可以看到打印出对应的内存占用数据:
python代码详细的内存占用情况

通过上述两种工具guppy与memory_profiler可以很好地来监控python代码运行时的内存占用问题。

内存调试工具:pdb

.单步执行代码,通过命令 python -m pdb xxx.py 启动脚本,进入单步执行模式

命令参考:

https://blog.csdn.net/wyb_009/article/details/8896744

https://www.cnblogs.com/xiaohai2003ly/p/8529472.html

ipdb参考:

https://blog.csdn.net/sinat_33741547/article/details/74781745

 

运行到目标位置中断程序,出现提示符,进入ipython环境
常用命令

    n(下一步)
    ENTER(重复上次命令)
    c(继续)
    s(进入子程序)
    p 变量 (打印变量)
    l(当前位置)
    r(运行直到程序结束)
    q(退出)
 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python读取大文件与内存占用检测(常用的分步调试pdb) 的相关文章

随机推荐

  • java中怎样测试webwervice_junit4单元测试--web项目中模拟登录会话,做全流程测试...

    junit4相对于junit3 基于注解的方式写单元测试用例 使用过程中方便很多 如下缩写均是代码片段 摘录其中关键部分 重要是理解其中知识点 一 编写测试用例基类 RunWith SpringJUnit4ClassRunner class
  • Qt的核心剖析:信息隐藏

    如果你阅读了 Qt 的源代码 你会看到一堆奇奇怪怪的宏 例如 Q D Q Q 我们的Qt源码之旅就从理解这些宏说起 下面先看一个C 的例子 class Person public Person Person string name void
  • UNIX环境高级编程(中文第三版)

    UNIX环境高级编程第三版 操作系统神级书 资料收集于网络 如有侵权 请联系我
  • xss靶场第四关过关秘籍

    首先寻找注入点 输入试一哈 结果发现我们输入的 lt gt 被过滤掉了 我们不使用 lt gt l了接下来换一个方法 我们可以将我们的js代码编写到onclick属性中试一哈 弹窗就说明过关了 看一哈在还有没有别的方法 测试后发现构造事件
  • leveldb官方手册摘录

    本文内容摘自leveldb官方手册 版权归其所有 CHAPTER 1 基本概念 leveldb是一个写性能十分优秀的存储引擎 是典型的LSM树 Log Structured Merge Tree 实现 LSM树的核心思想就是放弃部分读的性能
  • 【趣味编程】线型图统计不同字母的数量

    include
  • 深入理解js数组自定义排序sort

    定义和用法 sort 方法用于对数组的元素进行排序 语法 arrayObject sort function nextValue currentValue code 案例 var arr 5 4 3 2 1 6 7 8 9 倒序 arr s
  • dropout层加在哪里_【Keras】减少过拟合的秘诀——Dropout正则化

    摘要 Dropout正则化是最简单的神经网络正则化方法 阅读完本文 你就学会了在Keras框架中 如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里 Dropout正则化是最简单的神经网络正则化方法 其原理非常简单粗暴
  • Qt QSettings读写ini时 General 读不出来值

    简述 我有一个配置文件 其中一个组General 怎么都读不出正确的值 全是空 但是别的组能读出来 改General2试试 果然可以 就怀疑是不是组名称被内置了 打开QSettings的帮助文档 搜索General 有内容 看下解释 The
  • Android Service启动方式

    1 启动方式 Service 的启动方式主要有两种 分别是 startService 和 bindService 其中 StartService 使用的是同一个 Service onCreate 只执行一次 onStartCommand 也
  • bios显存改8g rx_玩屏蔽?爆4GB显存版RX480可刷成8GB版

    原标题 玩屏蔽 爆4GB显存版RX480可刷成8GB版 近日多名用户发现通过刷新固件方式将4GB显存的AMD Radeon RX480显卡变成更昂贵的8GB版本 部分4GB版显卡包含和8GB Radeon RX480显卡相同的芯片 只是在B
  • 【转载】OpenCV函数汇总

    一 读入图像 cv2 imread filepath flags filepath 要读入图片的完整路径 flags 读入图片的标志 cv2 IMREAD COLOR 默认参数 读入一副彩色图片 忽略alpha通道 cv2 IMREAD G
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 关于Linux上面无法读取资源目录下文件的问题

    一开始我的代码是这样子的 读取本地子路径下的json文件 代码运行的时候 在window是可以正常的 Override public String getBannerStr String str try Resource resource
  • 计算机网络面试要点总结

    概述 带宽 网络可通过的最高数据率 即每秒多少比特 宽带 发送速率 宽带线路 每秒有更多的比特注入到线路中 依然是串行传输 电路交换 需要拨号建立连接 专线 浪费资源 分组交换 分组发送 接收组合 存储转发 根据路由表的下一条 协议 语法
  • Java基础(8)面向对象基础

    面向对象是Java最重要的特性 Java是彻底的 纯粹的面向对象语言 在Java中 一切都是对象 本章将介绍面向对象基础知识 1 面向对象概述 面向对象的编程思想 按照真实世界客观事物的自然规律进行分析 客观世界中存在什么样的实体 构建的软
  • FOC中的PARK变换_TI和ST电机控制库的源码实现

    FOC中的Clarke变换 TI和ST电机控制库的源码实现 FOC中的PARK变换 TI和ST电机控制库的源码实现 FOC中的反PARK变换 TI和ST电机控制库的源码实现 park变换 该变换将平衡两相正交平稳系统中的矢量变换为正交旋转坐
  • winows服务器的ftp密码如何修改,windows怎么修改服务器ftp密码

    windows怎么修改服务器ftp密码 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 只有运行中的云服务器才允许用户登录
  • 服务器虚拟架构解决方案

    服务器虚拟化的意义 如何才能最大限度的节约建设成本 降低系统管理成本 节约人力投入 在提高老业务系统的性能 还降低新系统的开发部署成本 诸如此类的问题 我想一直是我们所追求的目标 特别是在当前经济发展比较困难的时期 如何才能在有效实现政府
  • Python读取大文件与内存占用检测(常用的分步调试pdb)

    大文件读取问题 顺便记录一下vim的配置 https blog csdn net sinat 33741547 article details 74781591 https blog csdn net zwbill article deta