python读取内存
① 性能测试,python 内存分析工具 -memray
Memray是彭博社开发的一款开源内存剖析工具,上线一个多月即获得8.4k星,因其在Python内存分析领域的出色表现,被誉为明星项目。Memray能够跟踪Python代码、本地扩展模块及Python解释器的内存分配情况,并生成多种报告,帮助开发者深入分析Python代码的内存使用状况。
Memray的安装和使用相对简单,只需运行命令:python3 -m memray --help以获取详细帮助信息。
在使用Memray时,可以通过以下命令执行分析:memray-py文件名.进程id.bin,进而将分析结果转换为HTML格式的火焰图报告,直观展示程序调用过程中的内存分配情况,宽度表示函数占用内存的多少。
值得注意的是,使用火焰图报告时,与不加参数的分析结果看似相似,实际上大相径庭。火焰图深入追踪内存分配,有助于在Python内存溢出时快速定位问题,但同时会增加数据收集速度和文件大小。
Memray提供多种报告形式,包括:
- 默认排序:根据Total memory从大到小排列。
- 按私有内存排序:使用"O"参数,按内存对象的私有内存大小从大到小排序。
- 按内存分配次数排序:使用"A"参数,按内存分配次数从高到底排序。
借助这些统计信息,开发者可以迅速定位占用内存大的对象和频繁分配内存的对象,从而重点分析和优化这些关键部分。
Memray还支持多种报告生成命令,包括:
- 火焰图报告:使用flamegraph命令生成。
- 表格报告:使用table命令生成。
- 树形报告:使用tree命令生成。
- 概要报告:使用summary命令生成。
- 详细统计报告:使用stats命令生成。
通过灵活使用这些报告类型,开发者可以全面了解Python程序的内存使用情况,有效提升代码性能和稳定性。
② python 一个文件太大+内存装不下+怎么读取 mongo
Python 环境下文件的读取问题,请参见拙文Python 基础 —— 文件
这是一道着名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件。
1. read() 接口的问题
f = open(filename, 'rb')
f.read()12
我们来读取 1 个 nginx 的日至文件,规模为 3Gb 大小。read() 方法执行的操作,是一次性全部读入内存,显然会造成:
MemoryError...12
也即会发生内存溢出。
2. 解决方案:转换接口
(1)readlines() :读取全部的行,构成一个 list,实践表明还是会造成内存的问题;
for line in f.reanlines(): ...1
2
(2)readline():每次读取一行,
while True:
line = f.readline() if not line: break1
2
3
4
(3)read(1024):重载,指定每次读取的长度
while True: block = f.read(1024) if not block: break1
2
3
4
- with open(filename, 'rb') as f: for line in f:
- <do something with the line>123
3. 真正 Pythonic 的方法
真正 Pythonci 的方法,使用 with 结构:
对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。
There should be one – and preferably only one – obvious way to do it.