This is NOT a duplicate of this. I'm not interested in finding out my memory consumption or the matter, as I'm already doing that below. The question is WHY the memory consumption is like this.
Also, even if I did need a way to profile my memory do note that guppy (the suggested Python memory profiler in the aforementioned link does not support Python 3 and the alternative guppy3 does not give accurate results whatsoever yielding in results …
我正在分析一个程序Pandas来处理一些CSV。我psutil's Process.memory_info用来报告虚拟内存大小(vms)和常驻集大小(rss)值。我还使用Pandas DataFrame.memory_usage (df.memory_usage().sum())报告dataframes内存中的大小。
报告值vms与df.memory_usage值之间存在冲突,在该报告中,Pandas仅报告的内存dataframe大于Process.memory_info调用报告的整个(单线程)流程的内存。
例如:
- rss:334671872 B
- vms:663515136 B
- df.memory_usage()。sum():670244208 B
该Process.memory_info呼叫在后立即memory_usage调用。我的预期结果是df.memory_usage < vms始终如此,但这并没有成立。我以为我误解了vms价值的含义?
我有一个 Python 进程,在很长一段时间(至少 10 小时,有时更长)后开始泄漏内存。这个问题很难重现,因此我想在问题出现时附加到正在运行的Python解释器,并以某种方式检查内存使用情况,例如通过获取当前分配最多内存的对象列表。
对于通常的分析工具(如tracemalloc或内存分析器)来说,这是很困难的,因为它们需要成为代码的一部分或与进程一起启动,并且它们对运行时性能有重大影响。
我想要的是一个采样分析器,我可以简单地将其附加到现有的 Python 进程(如py-spy ),但 py-spy 只能让我了解函数中花费的 CPU 时间,而不是内存使用情况。
是否有其他工具或不同的方法可以帮助我深入了解现有 Python 进程的内存使用情况?
编辑:我刚刚找到了pyrasite,它提供了pyrasite-memory-viewer命令,这正是我正在寻找的,但不幸的是该项目似乎被放弃了,我无法让它在Python 3.8上工作。
>>> sys.getsizeof(int)
436 #? does this mean int occupies 436 bytes .
>>> sys.getsizeof(1)
12 #12 bytes for int object, is this the memory requirement.
Run Code Online (Sandbox Code Playgroud)
我认为python中的int由4个字节表示,为什么它报告12个字节
请有人解释为什么当int只使用4个字节时报告12个字节
我有一个函数生成一个巨大的对象(大约100-150Gb的内存,在具有500Gb内存的机器上).
该函数在大约1小时内运行,并将文件写入磁盘(大约100Mb).
但是当函数结束时,程序在那里挂起几个小时而没有做任何事情(它在调用函数的地方之后没有继续指令).
我怀疑垃圾收集器试图删除在这个函数中创建的巨大对象,但我没有看到任何事情发生(strace打印没有),并且内存没有减少.
你知道为什么会这样,以及如何解决它?我正在使用python 3.5
我有一个在多个进程中运行的 Python 程序,我定期收到以下我无法解决的错误消息...... 关于原因的任何建议,或捕获此错误并继续解决它的方法?
File "/usr/lib/python3.4/multiprocessing/queues.py", line 242, in _feed
obj = ForkingPickler.dumps(obj)
File "/usr/lib/python3.4/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
MemoryError
Run Code Online (Sandbox Code Playgroud)
我正在运行 Python 3.4.2
我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了
import gc
import psutil
from pympler import muppy, summarize
gc.collect()
total_ram = psutil.Process().memory_info().rss
all_objects = muppy.get_objects(include_frames=True)
s = summary.summarize(all_objects)
python_objects_size = sum(row[2] for row in s)
Run Code Online (Sandbox Code Playgroud)
输出:102 MiB Python 对象,824 MiB RSS 内存!
[编辑] 3. 使用 tracemalloc; 它还返回价值约 100MiB 的 Python 对象
[编辑 2]export PYTHONMALLOC=malloc没有解决问题。
有没有办法查询 CPython 内存管理器来找出
设想:
我有一个连续运行的 python 进程(直到我们手动停止 - 无限地)并通过每 1 分钟读取某些系统文件来收集数据。当它启动时,它占用大约25 MB。但占用的内存量一天天增加,15天后就超过了500MB。
希望细节足够清楚,更多细节请告诉我,我可以澄清。
更新
我试图按照这个线程显示正在运行的Python应用程序的堆栈跟踪,但我面临以下无法完全解决的错误。
我搜索找到了这样的方法,可以挂钩已经运行的进程并获取堆栈/内存信息。但还没有运气,请帮助我。
我对特定python脚本的内存使用感到非常困惑.尽管有几个SO问题/ 答案的建议,我想我真的不知道如何描述用法.
我的问题是:和之间有什么区别?为什么一个人告诉我我正在使用大量的内存,另一个告诉我我不是?memory_profilerguppy.hpy
我正在使用pysam一个用于访问生物信息学SAM/BAM文件的库.当将SAM(ASCII)转换为BAM(二进制)并操纵其间的文件时,我的主脚本会快速耗尽内存.
我创建了一个小测试示例,以了解每一步分配多少内存.
# test_pysam.py:
import pysam
#from guppy import hpy
TESTFILENAME = ('/projectnb/scv/yannpaul/MAR_CEJ082/' +
'test.sam')
#H = hpy()
@profile # for memory_profiler
def samopen(filename):
# H.setrelheap()
samf = pysam.Samfile(filename)
# print H.heap()
pass
if __name__ == "__main__":
samopen(TESTFILENAME)
Run Code Online (Sandbox Code Playgroud)
使用memory_profiler(python -m memory_profiler test_pysam.py)监视内存使用情况会产生以下输出:
Filename: test_pysam.py
Line # Mem usage Increment Line Contents
================================================
10 @profile # for memory_profiler
11 def samopen(filename):
12 10.48 MB 0.00 MB …Run Code Online (Sandbox Code Playgroud) 我的python程序占用了比预期更多的内存或由内存分析工具返回.我需要一个策略来查找内存泄漏并修复它.
我在64位Linux机器上运行python3脚本.几乎所有代码都捆绑在一个对象中:
obj = MyObject(*myArguments)
result = obj.doSomething()
print(result)
Run Code Online (Sandbox Code Playgroud)
在创建过程中obj,程序会读取大小为ca.的文本文件.100MB.由于我以多种方式保存信息,我希望整个对象占用几个hundret MB内存.
实际上,用asizeof.asized(obj)包pympler测量它的大小会返回大约123MB.但是,top告诉我我的程序占用大约1GB的内存.
我知道方法中的局部变量会占用更多的RAM.但是,查看我的代码,我发现这些局部变量都不会那么大.我asizeof.asized再次使用双重检查.
我不担心脚本需要1GB的内存.但是,我并行执行了一些方法(在12个方面):
class MyObject()
def doSomething(arg):
# do something
def myParallelMethod(args)
with sharedmem.MapReduce() as pool:
result = pool.map(self.doSomething, args)
return result
Run Code Online (Sandbox Code Playgroud)
这使得总内存使用量变为8GB,即使我将所有大对象放在共享内存中:
self.myLargeNumPyArray = sharedmem.copy(self.myLargeNumPyArray)
Run Code Online (Sandbox Code Playgroud)
我向测试程序保证内存真的是共享的.
检查asizeof,我在每个子进程中获得了
asizeof.asized(self) 是1MB(即比"原始"对象小得多 - 可能是由于共享内存,不计算两倍)asizeof.asized(myOneAndOnlyBigLocalVariable) 是230MB.总而言之,我的程序应该占用不超过123MB + 12*230MB = 2.8GB << 8GB.那么,为什么程序需要这么多内存呢?
一种解释可能是当程序并行运行时,我的对象中存在一些被隐藏的部分(垃圾?).
有没有人知道找出内存泄漏的策略?我该怎么办呢?
我已阅读有关内存分析多个线程,例如剖析内存在Python 3,是否有工作存储器剖析了Python3, …
我有一个大小为13000*300000的数组,填充0到255之间的整数.我想将它们的数据类型从整数更改为float,就好像数据是一个numpy数组:
data.astype('float')
Run Code Online (Sandbox Code Playgroud)
在将其数据类型从整数更改为float时,它会显示内存错误.我有80 GB的RAM.它仍然显示内存错误.你能告诉我它是什么原因吗?
我正在写一个页面来从我的数据库中下载数百万条记录。我计划在内存有限的环境中运行它。因此我想流式传输 CSV 数据。由于某种原因,这段代码仍然使用大量内存,并且在我完成下载后没有释放内存。是什么导致了这种泄漏。我的应用程序从占用 30MB 内存到 2GB
@app.route('/admin/querydb', methods=['GET', 'POST'])
@admin_filter
def admin_query_db():
if request.method == 'POST':
query = model.DriverStop.query.join(model.DriverDailyRoute, model.Agency).join(model.User)
if 'date_filter_start' in request.form:
start = datetime.datetime.strptime(request.form['start_date'], '%Y-%m-%d')
start -= datetime.timedelta(days=1)
query = query.filter(model.DriverDailyRoute.date >= start)
if 'date_filter_end' in request.form:
end = datetime.datetime.strptime(request.form['end_date'], '%Y-%m-%d')
query = query.filter(model.DriverDailyRoute.date < end)
if not 'recipient' in request.form:
query = query.filter(model.Agency.agency_type != model.Agency.RECIPIENT)
if not 'donor' in request.form:
query = query.filter(model.Agency.agency_type != model.Agency.DONOR)
header = ['Username', 'Last Name', 'First Name', 'Agency Name',
'Agency Type', …Run Code Online (Sandbox Code Playgroud) 在这个问题的最后我找到了一些代码。为了方便起见,我将其放在这里:
import memory_profiler as mp
def fun(n):
tmp = []
for i in range(n):
tmp.extend(list(range(i*i)))
return "XXXXX"
start_mem = mp.memory_usage(max_usage=True)
res = mp.memory_usage(proc=(fun, [100]), max_usage=True, retval=True)
print('start mem', start_mem)
print('max mem', res[0][0])
print('used mem', res[0][0]-start_mem)
print('fun output', res[1])
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为 res 不是双精度数组,它是浮点数。此外,我不明白如何检查许多函数的内存使用情况。我的意思是,像这样的东西会起作用吗?
import memory_profiler as mp
def fun1(n):
return "XXXXX"
def fun2(n):
return "YYYYY"
methods = [
'fun1(n)',
'fun2(n)',
]
start_mem = mp.memory_usage(max_usage=True)
res = mp.memory_usage(proc=(methods[0], [100]), max_usage=True, retval=True)
print('start mem', start_mem)
print('max mem', res[0][0])
print('used mem', res[0][0]-start_mem)
print('fun output', …Run Code Online (Sandbox Code Playgroud) python ×13
memory ×3
memory-leaks ×2
profiling ×2
psutil ×2
python-3.x ×2
asynchronous ×1
flask ×1
numpy ×1
pandas ×1
performance ×1
sqlalchemy ×1
storage ×1
types ×1