电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python 循環讀取數據內存不足的解決方案

瀏覽:89日期:2022-06-18 13:11:44
看代碼吧~

import gcfor x in list(locals().keys())[:]: del locals()[x]# del all_s_x, AE, AE_split, x_ticks, splitgc.collect()

補充:Python讀取大文件的'坑“與內存占用檢測

python讀寫文件的api都很簡單,一不留神就容易踩”坑“。筆者記錄一次踩坑歷程,并且給了一些總結,希望到大家在使用python的過程之中,能夠避免一些可能產生隱患的代碼。

1.read()與readlines():

隨手搜索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,當文件大小大于可用內存時,自然會發生內存溢出的錯誤。

Python 循環讀取數據內存不足的解決方案

同樣的,readlines會構造一個list。list而不是iter,所以所有的內容都會保存在內存之上,同樣也會發生內存溢出的錯誤。

Python 循環讀取數據內存不足的解決方案

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: breakwith open(file_path, ’rb’) as f: for line in f:print(line)3.內存檢測工具的介紹:

對于python代碼的內存占用問題,對于代碼進行內存監控十分必要。這里筆者這里推薦兩個小工具來檢測python代碼的內存占用。

memory_profiler

首先先用pip安裝memory_profiler

pip install memory_profiler

memory_profiler是利用python的裝飾器工作的,所以我們需要在進行測試的函數上添加裝飾器。

from hashlib import sha1import sys@profiledef 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**

就可以了解函數每一步代碼的內存占用了

Python 循環讀取數據內存不足的解決方案

guppy

依樣畫葫蘆,仍然是通過pip先安裝guppy

pip install guppy

之后可以在代碼之中利用guppy直接打印出對應各種python類型(list、tuple、dict等)分別創建了多少對象,占用了多少內存。

from guppy import hpyimport sysdef 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代碼運行時的內存占用問題。

4.小結:

python是一門崇尚簡潔的語言,但是正是因為它的簡潔反而更多了許多需要仔細推敲和思考的細節。希望大家在日常工作與學習之中也能多對一些細節進行總結,少踩一些不必要的“坑”。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 365文案网_全网创意文案句子素材站| 直齿驱动-新型回转驱动和回转支承解决方案提供商-不二传动 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 路面机械厂家| 上海阳光泵业制造有限公司 -【官方网站】| 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 悬浮拼装地板_幼儿园_篮球场_悬浮拼接地板-山东悬浮拼装地板厂家 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 体坛网_体坛+_体坛周报新闻客户端 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 我爱古诗词_古诗词名句赏析学习平台| 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 |