相关疑难解决方法(0)

为什么读取整个文件占用的 RAM 大于其在磁盘上的大小?

警告

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 …

python storage psutil

7
推荐指数
1
解决办法
980
查看次数

使用psutil.Process.memory_info的内存使用不同于Pandas.memory_usage

我正在分析一个程序Pandas来处理一些CSV。我psutil's Process.memory_info用来报告虚拟内存大小(vms)和常驻集大小(rss)值。我还使用Pandas DataFrame.memory_usage (df.memory_usage().sum())报告dataframes内存中的大小。

报告值vmsdf.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 pandas psutil

7
推荐指数
1
解决办法
132
查看次数

分析正在运行的 Python 进程的内存使用情况

我有一个 Python 进程,在很长一段时间(至少 10 小时,有时更长)后开始泄漏内存。这个问题很难重现,因此我想在问题出现时附加到正在运行的Python解释器,并以某种方式检查内存使用情况,例如通过获取当前分配最多内存的对象列表。

对于通常的分析工具(如tracemalloc内存分析器)来说,这是很困难的,因为它们需要成为代码的一部分或与进程一起启动,并且它们对运行时性能有重大影响。

我想要的是一个采样分析器,我可以简单地将其附加到现有的 Python 进程(如py-spy ),但 py-spy 只能让我了解函数中花费的 CPU 时间,而不是内存使用情况。

是否有其他工具或不同的方法可以帮助我深入了解现有 Python 进程的内存使用情况?

编辑:我刚刚找到了pyrasite,它提供了pyrasite-memory-viewer命令,这正是我正在寻找的,但不幸的是该项目似乎被放弃了,我无法让它在Python 3.8上工作。

python profiling memory-leaks python-3.x

7
推荐指数
1
解决办法
3489
查看次数

我如何确定python使用的类型的确切大小

>>> 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个字节

python

6
推荐指数
1
解决办法
330
查看次数

在创建巨大的对象之后,Python在函数结束时挂了好几个小时

我有一个函数生成一个巨大的对象(大约100-150Gb的内存,在具有500Gb内存的机器上).

该函数在大约1小时内运行,并将文件写入磁盘(大约100Mb).

但是当函数结束时,程序在那里挂起几个小时而没有做任何事情(它在调用函数的地方之后没有继续指令).

我怀疑垃圾收集器试图删除在这个函数中创建的巨大对象,但我没有看到任何事情发生(strace打印没有),并且内存没有减少.

你知道为什么会这样,以及如何解决它?我正在使用python 3.5

python memory

6
推荐指数
1
解决办法
83
查看次数

通用 Python 错误“MemoryError”

我有一个在多个进程中运行的 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

python asynchronous

6
推荐指数
0
解决办法
607
查看次数

调试 CPython 内存碎片

我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了

  1. 运行 gc.collect()
  2. 使用 pympler 发现所有已知的 Python 对象
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 内存管理器来找出

  • 它持有多少 RAM,以便我可以从 RSS 中减去它并找出是否有任何未使用 PyMem_Malloc 并且正在泄漏的 C 库
  • 为什么它持有内存(例如,由于一个 20 字节的 PyObject 仍在被引用,因此发现它持有一个 64kb 的页面)
  • 识别调用 PyMem_Malloc …

python garbage-collection

6
推荐指数
1
解决办法
219
查看次数

python 进程的内存使用量逐日增加

设想:

我有一个连续运行的 python 进程(直到我们手动停止 - 无限地)并通过每 1 分钟读取某些系统文件来收集数据。当它启动时,它占用大约25 MB。但占用的内存量一天天增加,15天后就超过了500MB。

  • 我是一个Python新手,所以无法通过手动/使用调试器检查代码来找出问题,
  • 我不知道有什么工具可以轻松发现问题,请建议一些可以帮助我发现问题的工具或方法。
  • 我认为这可能是内存泄漏问题或变量一次又一次地向其附加数据,并且根本没有释放它......请向我指出某些参考文献,它们可以帮助我理解 python 中的此类问题。

希望细节足够清楚,更多细节请告诉我,我可以澄清。

更新

我试图按照这个线程显示正在运行的Python应用程序的堆栈跟踪,但我面临以下无法完全解决的错误。

  • 当前上下文中没有符号“PyEval_EvalFrameEx”。
  • 当前上下文中没有符号“PyStringObject”。

我搜索找到了这样的方法,可以挂钩已经运行的进程并获取堆栈/内存信息。但还没有运气,请帮助我。

python memory performance memory-leaks

5
推荐指数
1
解决办法
1932
查看次数

Python中的内存使用:memory_profiler和guppy有什么区别?

我对特定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 memory-profiling

5
推荐指数
1
解决办法
3926
查看次数

Python3:程序占用的内存比预期的多得多

我的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, …

python memory profiling multiprocessing memory-profiling

5
推荐指数
0
解决办法
693
查看次数

Python:将数据类型从整数更改为float时出现内存错误

我有一个大小为13000*300000的数组,填充0到255之间的整数.我想将它们的数据类型从整数更改为float,就好像数据是一个numpy数组:

 data.astype('float')
Run Code Online (Sandbox Code Playgroud)

在将其数据类型从整数更改为float时,它会显示内存错误.我有80 GB的RAM.它仍然显示内存错误.你能告诉我它是什么原因吗?

python types numpy

4
推荐指数
1
解决办法
4832
查看次数

流式响应时 Flask、SQLAlchemy 和高内存使用率

我正在写一个页面来从我的数据库中下载数百万条记录。我计划在内存有限的环境中运行它。因此我想流式传输 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)

python sqlalchemy flask

3
推荐指数
1
解决办法
1710
查看次数

如何使用Python内存分析器查找内存使用情况?

在这个问题的最后我找到了一些代码。为了方便起见,我将其放在这里:

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 python-3.x

2
推荐指数
1
解决办法
7125
查看次数