Python 读取大文件

news2024/11/18 15:30:43

读取大文件

python读取文件一般情况是利用open()函数以及read()函数来完成:

f = open(filename,'r')
f.read()

这种方法读取小文件,即读取大小远远小于内存的文件显然没有什么问题。但是如果是将一个10G大小的日志文件读取,即文件大小大于内存,这么处理就有问题了,会造成MemoryError … 也就是发生内存溢出。

这里发现跟read()类似的还有其他的方法:read(参数)、readline(参数)、readlines(参数)

read(参数):

read() 方法用于从文件读取指定的字符数(文本模式 t)或字节数(二进制模式 b),如果未给定参数 size 或 size 为负数则读取文件所有内容

while True:
    block = f.read(1024)
    if not block:
        break

readline(参数):

readline() 方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。

while True:
    line = f.readline()
    if not line:
        break

readlines(参数):

readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。

读取全部的行,构成一个list,通过list来对文件进行处理,但是这种方式依然会造成MemoyError

for line in f.readlines():
    ....

分块读取:

处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了iter 和 yield:

def read_in_chunks(filePath, chunk_size=1024*1024):
    """
    Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1M
    You can set your own chunk size
    """
    file_object = open(filePath)
    while True:
        chunk_data = file_object.read(chunk_size)
        if not chunk_data:
            break
        yield chunk_data
if __name__ == "__main__":
    filePath = './path/filename'
    for chunk in read_in_chunks(filePath):
        process(chunk) # <do something with chunk>

使用With open():
with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件

# If the file is line based
with open(...) as f:
  for line in f:
    process(line) # <do something with line>

关于with open()的优化:
面对百万行的大型数据使用with open 是没有问题的,但是这里面参数的不同也会导致不同的效率。经过测试发先参数为”rb”时的效率是”r”的6倍。由此可知二进制读取依然是最快的模式。

with open(filename,"rb") as f: 
  for fLine in f: 
    pass 

测试结果:rb方式最快,100w行全遍历2.9秒。基本能满足中大型文件处理效率需求。如果从rb(二级制读取)读取改为r(读取模式),慢5-6倍。

内存检测工具介绍

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(1024 * 1024)
            if buf:
                sha1Obj.update(buf)
            else:
                break
    print(sha1Obj.hexdigest())
if __name__ == '__main__':
    my_func()

之后在运行代码时加上-m memory_profiler

就可以了解函数每一步代码的内存占用了。例如下图:


guppy

 

首先,通过pip先安装guppy3

pip install guppy3

之后可以在代码之中利用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

 

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

也可以使用mem_top或者pyrasite。有兴趣的可以看一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“深度学习”学习日记。与学习有关的技巧--正则化

2023.1.29 在机器学习的过程中&#xff0c;过拟合是一个常见的问题。过拟合指的是只能够拟合训练数据&#xff0c;但不能很好的拟合测试数据&#xff1b;机器学习的目的就是提高泛化能力&#xff0c;即便是没有包括在训练数据里的测试数据&#xff0c;也希望神经网络模型可以正…

javafx中gif 内存优化

1.背景 桌面程序对内存消耗要求很高&#xff0c;基本的要求是整个程序控制在500M以内。 这就要求每个功能点的内存消耗尽可能地少&#xff0c;大于50M的内存消耗就要想办法优化。 2.现状 gif的显示会导致程序的内存激增。以数字大脑用的雷达图动画为例进行说明&#xff0c;下…

TypeScript 学习笔记总结(一)

ts学习笔记总结。 文章目录一、什么是TypeScript&#xff1f;二、TypeScript 环境搭建三、TS 类型声明四、TS 类型详解五、TS 类型总结六、TS 编译选项1. tsconfig.json的 作用2. tsconfig.json的 配置选项013. tsconfig.json的 配置选项02七、Webpack 打包ts代码一、什么是Typ…

Bayanay:一款基于Python开发的无线网络安全研究工具

关于Bayanay Bayanay是一款基于纯Python开发的无线网络安全研究工具&#xff0c;在该工具的帮助下&#xff0c;无论你身处何地&#xff0c;都可以轻松地对周围地区的无线网络安全状况进行研究与分析。 该工具可以通过使用HTML5的地理位置定位功能并结合Scapy获取到的SSID信息…

LeetCode刷题系列 -- 25. K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&…

zabbix6,0创建监控项与触发器

zabbix_server IP : 172.31.0.5:10051 zabbix_client IP : 172.31.0.9:10050 zabbix_client已经运行了zabbix-agent,这里我用的是版本2 一、 创建监控项 1、 在客户端创建监控脚本 /etc/zabbix/zabbix_agent2.d #默认配置文件路径 2、 创建配置文件&#xff0c;编写监控脚本…

绿光GOQDs-SA氧化石墨烯量子点CdTe-FA-CS修饰CdTe-PEG-CS的制备

绿光GOQDs-SA氧化石墨烯量子点CdTe-FA-CS修饰CdTe-PEG-CS的制备今天小编分享制备GOQDs改性SA复合杂化膜&#xff0c;一起看看吧&#xff1a;GOQDs改性SA复合杂化膜的制备过程&#xff1a;将一系列不同分子量的CS及接枝壳聚糖用少量乙酸-乙酸钠溶液溶解后,加水稀释到一定浓度,用…

经典文献阅读之--FlowFormer(Transformer结构光流估计)

0. 简介 对于视觉SLAM而言&#xff0c;除了使用特征点法来完成VIO以外&#xff0c;还可以使用光流法来完成VIO的估计。而传统的光流法受环境&#xff0c;光照变化严重&#xff0c;所以有时候会出现光流偏差等问题。所以现在有越来越多的工作朝着深度学习的方向扩展&#xff0c…

卷积神经网络中的Conv层和BN层融合细节

BN层 批归一化层&#xff08;Batch Normallization&#xff09;是一种在卷积神经网络模型中大量使用&#xff0c;为了加速模型收敛的技术。为什么CNN 中引入 BN 层可以加速网络的收敛呢&#xff1f;因为将输入的样本数据或特征图&#xff0c;归一化后&#xff0c;改善了输入数…

智云通CRM:如何在初次见面识别客户机会?

有一次&#xff0c;我给一家公司做CRM系统培训之后&#xff0c;他们公司的老总请我吃饭。那是我们第一次见面&#xff0c;在饭桌上&#xff0c;我和他聊天&#xff0c;说&#xff1a;“洛老师&#xff0c;你们的CRM系统功能真的很不错&#xff0c;帮我我解决了很多销售管理上的…

设计模式面试题 一

第一题&#xff1a;阐述设计模式的责任链&#xff1f; 责任链模式定义&#xff1a; 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送 者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一 个对象处理它为止。 …

Ruoyi-Cloud框架学习-【03 后端启动 + 前端启动】

打开运行基础模块&#xff08;启动没有先后顺序&#xff09; 记得在后台先启动Redis,不然会报错 RuoYiGatewayApplication &#xff08;网关模块 必须&#xff09; &#xff1a; 即前端所有访问需要通过网关而不是直接访问具体接口、网关会对后台的微服务进行转发 RuoYiAuth…

虹科回顾 | 虹科云科技2022年深度好文

2022年&#xff0c;我们一起学习了很多技术文章、优秀案例 我们的关键词是 数据库、BI、文件存储、高性能计算、数据管理、IT 下面一起来回顾虹科云科技过去一年的深度好文吧! 2022虹科云科技深度好文回顾 点击文字均可跳转到相关文章 数据库系列 ● 虹科产品 | 一文详解…

springboot1

让我们快速构建项目并且运行&#xff0c;他就是搭建程序的脚手架 尽可能减少一切xml的相关配置 快速创建一个spring boot的启动项目 在pom.xml中导入父类的启动器 引入父类的依赖 下面我们写一个web的启动器 这个启动器导入了之后 整个web项目需要的依赖也就导入了 并且把版…

【MIUI刷机】旧机降级记录

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 小米MAX2是我的第一部小米手机&#xff0c;这款发布于2017年5月25日的小米手机已伴随我5年了&#xff0c;现在再次拿起这部手机&#xff0c;依然能勾起我对当时手机圈的记忆。 当时的我对手…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-群集方案

群集方案 群集介绍 在大规模的外呼或者呼入系统&#xff0c;比如整个系统需要1万并发&#xff0c;单机最高也就3000-5000并发&#xff0c;这时候就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库&#xff0c;多个FreeSWITCH(mod_cti)连接同一个redis就可以很容易的配置…

基于乾元通多卡聚合智能通信系统的典型应用场景分析

紧急事态处置 城市公共安全包含自然灾害事故灾难、公共卫生事件、社会安全事件、事故灾难&#xff0c;在城镇化快速发展的今天&#xff0c;作为维护公共安全的职能部门&#xff0c;带来了新的挑战。 乾元通科技使用多径混传、多路聚合技术&#xff0c;开发出的智能融合通信设备…

五款非常轻便的实用小工具

大伙们&#xff0c;开工大吉&#xff01; 1.系统清理——WiseCare365 WiseCare365是由WiseCleaner开发的一款用来管理&#xff0c;维护&#xff0c;配置以及解决电脑故障的适用于Windows操作系统的电脑的免费软件。其实Wise Care 365就是把这个公司之前推出的所有优化工具整合…

Redmi GPro游戏本升级系统失败无法启动怎么办?

Redmi GPro游戏本升级系统失败无法启动怎么办&#xff1f;有用户使用Redmi GPro电脑去进行电脑系统的升级时&#xff0c;出现了系统升级错误。在电脑关机重新启动之后&#xff0c;电脑出现了蓝屏的情况。那么遇到这个问题要怎么去进行解决呢&#xff1f;来看看具体的解决方法吧…

美颜滤镜sdk常用的图形处理算法、代码分析

美颜滤镜sdk目前在视频、图文社交平台中的使用率是非常高的&#xff0c;特别是短视频平台和直播平台。今天小编就为大家讲解一下美颜滤镜sdk经常用到的算法和代码。 一、预处理算法、检测算法 在采集完图像后&#xff0c;首先会对图像进行预处理操作。保证图像的对比度清晰&…