我用来从资源中StreamResourceInfo.Stream获取BitmapImage资源.使用后流Close和Dispose流是否正确?我问,因为在内存分析器中,如果我这样做,我会收到错误.内存分析器表示已处理的实例尚未进行GCed.
如果我在网上看,我只能在这个主题上找到这篇文章.在这篇文章中,回应的人说,这是有意义的处置.但是,如果我看一下情况和影响,我认为这是不对的.有人知道什么是正确的行动?
附加信息:在我看过的msdn示例中,它们不是Dispose或Close.
编辑
感谢Rick Sladkeys回答,我找到了解决方案:我分配StreamResourceInfo.Stream给了StreamSource-property BitmapImage.在msdn中写道:
如果要在创建BitmapImage后关闭流,请将CacheOption属性设置为BitmapCacheOption.OnLoad.默认的OnDemand缓存选项保留对流的访问,直到需要位图,并且清理由垃圾收集器处理.
这意味着,BitmapImage获取流的所有权.这就是为什么如果我手动关闭/处理流,内存分析器会显示错误:Bitmap将保存对流的引用(BitmapCacheOption OnDemand),因此只要BitmapImage有效,GC就不会释放它,但是流已经明确表示处置.在这个具体的例子中,处置是一个糟糕的想法.
为了完整性,我还在msdn中查看了TextRange.Load调用上述链接的示例.因为Load,相反,Load不占用所有权,因此必须在完成后关闭/处理流.
我正在运行一个大型的ASP.net 4.0网站.它使用了流行的.Net内容管理系统,拥有数千个内容项,数百个并发用户 - 基本上是一个沉重的网站.
在1天的过程中,IIS7工作进程的内存使用量可以增加到8-10GB.服务器已安装16GB,目前设置为每天回收一次应用程序池.
我受到压力以减少内存使用量.大部分内存使用是由于缓存大量数据 - 但缓存间隔仅设置为5-10分钟 - 因此这些字符串最终应该从内存中过期.
但是在运行RedGate Memory Profiler之后,我可以看到我认为的内存泄漏.我已经通过"由Disposed Objects专门保存在内存中"的对象过滤了我的实例列表结果(我在RedGate论坛上看到这就是你发现内存泄漏的方法).这给了我一长串的内存字符串.
对于每个字符串,我使用实例保留图来查看内存中保存它的内容.System.string对象似乎在某些时候被System.Web.Caching.CacheDependency缓存了.如果我一直遵循图形,它会通过各种其他类,包括System.Collections.Specialized.ListDictionary,直到它到达System.Web.FileMonitor.这是有道理的,因为字符串是文件的路径(图像/ PDF /等).
似乎CMS正在缓存文件的路径,但这些缓存的对象随后被"泄露".随着时间的推移,这会增加并消耗RAM.
对不起,这是啰嗦......有没有办法阻止这些内存泄漏?或者在不诉诸回收应用程序池的情况下清除它们?我可以找到正在进行缓存的类/代码,看看我是否可以修复泄漏?
我想分析类方法的时间和内存使用情况.我没有找到这一个彻头彻尾的现成的解决方案(有没有这样的模块?),我决定使用timeit时间分析和memory_usage从memory_profiler模块.
我遇到了分析方法的问题memory_profiler.我尝试了不同的变体,但没有一个变得有效.
当我尝试使用partial from时functools,我收到此错误:
File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 126, in memory_usage
aspec = inspect.getargspec(f)
File "/usr/lib64/python2.7/inspect.py", line 815, in getargspec
raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <functools.partial object at 0x252da48> is not a Python function
Run Code Online (Sandbox Code Playgroud)
顺便说一下,完全相同的方法与timeit函数一起工作.
当我尝试使用时lambda,我收到此错误:
File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 141, in memory_usage
ret = parent_conn.recv()
IOError: [Errno 4] Interrupted system call
Run Code Online (Sandbox Code Playgroud)
如何使用memory_profiler处理类方法?
PS:我有内存分析器(0.26)(用pip安装).
UPD:实际上是bug.你可以在这里查看状态:https://github.com/fabianp/memory_profiler/issues/47
背景:我试图在Xamarin.Android应用程序中追踪内存泄漏.使用DDMS和Eclipse Memory Profiler,我能够看到哪些对象是活着的.当试图追踪持有它们的东西(GC Root)时,我只看到"原生堆栈"(当然).
如何获取MONO VM的堆快照?所以我以后可以使用ie快照工具?
或者是否有任何其他技术我可以用来找到Xamarin.Android的.NET部分中持有物体的东西?是否可以在程序中做一些事情?
我在系统上安装了 memory_profiler 并运行了这个程序
!/usr/bin/env python
from memory_profiler import profile
@profile(precision=4)
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
if __name__ == '__main__':
my_func()
Run Code Online (Sandbox Code Playgroud)
运行 python fp.py 后显示
Filename: fp.py
Line # Mem usage Increment Line Contents
================================================
4 12.6992 MiB 0.0000 MiB @profile(precision=4)
5 def my_func():
6 20.3516 MiB 7.6523 MiB a = [1] * (10 ** 6)
7 172.8945 MiB 152.5430 MiB b = [2] …Run Code Online (Sandbox Code Playgroud) 我正在尝试了解如何使用xcode在Mac上解释仪器分析器的结果。我主要是想了解体重/体重和自身体重的区别。
这是我的结果,未经修改
结果A:
Weight Self Weight Symbol
1.98 s 16.8% 45.00ms bool doSomething(xxx)
Run Code Online (Sandbox Code Playgroud)
这是我修改后的结果(应该更快)
结果B:
Weight Self Weight Symbol
1.38 s 19.0% 47.00ms bool doSomething(xxx)
Run Code Online (Sandbox Code Playgroud)
我的问题是体重和自重有何不同?此链接说明
权重该符号及其子元素花费在运行上的时间,以及相对于同时运行的其他符号花费的运行时间的百分比。
自我权重符号花费的运行时间。
我想知道这种方法从头到尾执行需要多长时间?在我的示例中,在停止事件探查器之前,我已经运行了3次此方法。有人可以解释一下体重与体重之间的区别吗?从以上两个结果中看哪个更快。有人可以解释为什么吗?
我正在尝试使用分析来查看我的代码的哪一部分负责最大使用 3GB 内存(如gc()最大使用内存统计报告所示,请参阅此处如何)。我正在运行这样的内存分析:
Rprof(line.profiling = TRUE, memory.profiling = TRUE)
graf(...) # ... here I run the profiled code
Rprof(NULL)
summaryRprof(lines = "both", memory = "both")
Run Code Online (Sandbox Code Playgroud)
输出如下:
$by.total
total.time total.pct mem.total self.time self.pct
"graf" 299.12 99.69 50814.4 0.02 0.01
#2 299.12 99.69 50814.4 0.00 0.00
"graf.fit.laplace" 299.06 99.67 50787.2 0.00 0.00
"doTryCatch" 103.42 34.47 4339.2 0.00 0.00
"chol" 103.42 34.47 4339.2 0.00 0.00
"tryCatch" 103.42 34.47 4339.2 0.00 0.00
"tryCatchList" 103.42 34.47 4339.2 0.00 0.00
"tryCatchOne" 103.42 …Run Code Online (Sandbox Code Playgroud) 在包含对data.table函数调用的R代码中分析内存的正确方法是什么?假设我要确定表达式期间的最大内存使用量。
该参考文献表明Rprofmem可能不是正确的选择:https :
//cran.r-project.org/web/packages/profmem/vignettes/profmem.html
记录通过R的本机API的本机allocVector3()部分完成的所有内存分配,这意味着几乎所有的内存分配都被记录。R的垃圾收集器会在某些时候自动释放所有以这种方式分配的对象。profmem()不会记录垃圾收集事件。未记录的分配是由非R本机库或将内部代码Calloc()/ Free()用于内部对象的R包完成的分配。R垃圾收集器不处理此类对象。
data.table源代码包含对的大量调用Calloc(),malloc()因此这表明这Rprofmem将无法衡量data.table函数分配的所有内存。如果Rprofmem不是正确的工具,那么Matthew Dowle怎么在这里使用它:R:循环遍历data.table中的列?
我发现了一个参考文献,提出了类似的潜在问题gc()(可用于测量两次调用之间的最大内存使用量gc()):https :
//r.789695.n4.nabble.com/Determining-the-maximum-memory-usage -of-a-function-td4669977.html
gc()是一个好的开始。在任务执行之前调用gc(reset = TRUE),在执行任务之后调用gc(),您会在此期间看到R占用的最大额外内存。(这不包括编译后的代码分配的内存,这在重新使用时很难测量。)
我没有发现任何暗示存在类似问题Rprof(memory.profiling=TRUE)。这是否意味着即使不总是使用R API分配内存,该Rprof方法data.table仍然适用?
如果Rprof(memory.profiling=TRUE)实际上不是该工作的正确工具,那是什么?
会ssh.utils::mem.usage工作吗?
当我在GPU设备上训练我的 pytorch 模型时,我的 python 脚本突然被杀死。深入研究操作系统日志文件,我发现脚本被 OOM Killer 杀死,因为我的CPU内存不足。It\xe2\x80\x99s 非常奇怪的是,我在GPU设备上训练了模型,但CPU内存用完了。\n OOM 杀手日志文件的快照\n
为了调试这个问题,我安装了 python 内存分析器。从内存分析器查看日志文件,我发现当发生列-=操作时,我的 CPU 内存逐渐增加,直到 OOM Killer 杀死我的\n程序。\n Python 内存分析器的快照\n
\n这\xe2\x80\x99s很奇怪,我尝试了很多方法来解决这个问题。最后,我发现在赋值操作之前,我先分离Tensor。神奇的是,它解决了这个问题。但我不明白\xe2\x80\x99不明白清楚为什么它有效。这是我原来的函数代码。
def GeneralizedNabla(self, image):\n pad_size = 2\n affinity = torch.zeros(image.shape[0], self.window_size**2, self.h, self.w).to(self.device)\n h = self.h+pad_size\n w = self.w+pad_size\n #pad = nn.ZeroPad2d(pad_size)\n image_pad = self.pad(image)\n for i in range(0, self.window_size**2):\n affinity[:, i, :, :] = image[:, :, :].detach() # initialization\n dy = int(i/5)-2\n dx = …Run Code Online (Sandbox Code Playgroud) python memory-leaks memory-profiling backpropagation pytorch
我从文件夹中有以下代码example,但我添加了@profile. 我只是想让这个例子运行,因为在我的代码中更复杂,我有同样的错误,我想知道每行使用了多少内存。
系统:
蟒蛇:3.9
内存分析器:0.58
操作系统:Manjaro
代码:
import time
import multiprocessing as mp
from memory_profiler import profile
# Big numbers
X6 = 10 ** 6
X7 = 10 ** 7
def worker(num, wait, amt=X6):
"""
A function that allocates memory over time.
"""
frame = []
for idx in range(num):
frame.extend([1] * amt)
time.sleep(wait)
del frame
def main_sequential():
"""
A sequential version of the work, where one worker is called at a time.
"""
worker(5, 5, …Run Code Online (Sandbox Code Playgroud) memory-profiling ×10
memory-leaks ×4
python ×4
r ×2
android ×1
asp.net ×1
c# ×1
c++11 ×1
data.table ×1
functools ×1
heap-dump ×1
idisposable ×1
imagesource ×1
memory ×1
methods ×1
objective-c ×1
performance ×1
profiling ×1
python-3.x ×1
pytorch ×1
redgate ×1
wpf ×1
xamarin ×1
xcode ×1