我是内存分析Windows Phone应用程序的新手.停止内存分析会话后,Visual Studio会尝试解析日志,并使用"解析日志文件失败"消息进行故障转移.我看到%temp%目录中的"ProfilerLog_"文件并收到此消息:
System.ArgumentException: Item has already been added. Key in dictionary: '226295856' Key being added: '226295856'
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
at System.Collections.Hashtable.Add(Object key, Object value)
at SilverlightProfiler.Internal.CFAdapter.HandleEvent(UInt32 eventID, ProbeMarkerType eventMarkerType, Double clockTime, Double threadTime, UInt32 threadID, ThreadType threadType, List`1 eventInfoList)
at SilverlightProfiler.Internal.WPInputAdapter.HandleEvent(ProbeEventSource eventSource, UInt32 eventID, ProbeMarkerType eventMarkerType, Double clockTime, Double threadTime, UInt32 threadID, ThreadType threadType, List`1 eventInfoList)
at SilverlightProfiler.Internal.WPInputAdapter.HandleEvent(BinaryReader input, Int64 endOffset, ThreadStreamInfo threadStreamInfo)
at SilverlightProfiler.Internal.WPInputAdapter.HandleEvents()
at SilverlightProfiler.Internal.WPInputAdapter.ParseLogFile(BinaryReader input, String logFilename, AgLogFileHeader header)
at SilverlightProfiler.Internal.WPInputAdapter.Parse(Object data) …Run Code Online (Sandbox Code Playgroud) 我对特定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批处理器,它加载二进制数据,执行numpy操作并存储结果.它消耗的内存比它应该多得多.我查看了类似的堆栈溢出讨论,并想要求进一步的建议.
我将光谱数据转换为rgb.光谱数据存储在线段交错(BIL)图像文件中.这就是我逐行读取和处理数据的原因.我使用Spectral Python Library读取数据,它返回一个numpy数组.hyp是大型光谱文件的描述符:hyp.ncols = 1600,hyp.nrows = 3430,hyp.nbands = 160
import spectral
import numpy as np
import scipy
class CIE_converter (object):
def __init__(self, cie):
self.cie = cie
def interpolateBand_to_cie_range(self, hyp, hyp_line):
interp = scipy.interpolate.interp1d(hyp.bands.centers,hyp_line, kind='cubic',bounds_error=False, fill_value=0)
return interp(self.cie[:,0])
#@profile
def spectrum2xyz(self, hyp):
out = np.zeros((hyp.ncols,hyp.nrows,3))
spec_line = hyp.read_subregion((0,1), (0,hyp.ncols)).squeeze()
spec_line_int = self.interpolateBand_to_cie_range(hyp, spec_line)
for ii in xrange(hyp.nrows):
spec_line = hyp.read_subregion((ii,ii+1), (0,hyp.ncols)).squeeze()
spec_line_int = self.interpolateBand_to_cie_range(hyp,spec_line)
out[:,ii,:] = np.dot(spec_line_int,self.cie[:,1:4])
return out
Run Code Online (Sandbox Code Playgroud)
所有大数据都在循环外初始化.我天真的解释是内存消耗不应该增加(我是否使用了太多的Matlab?)有人能解释一下增加因子10吗?这不是线性的,因为hyp.nrows …
我能够生成* .dat文件:
vikas@server:~/memory_profiler-0.36$ ./mprof run --python test_sl.py
vikas@server:~/memory_profiler-0.36$ ls *.dat
mprofile_20151001035123.dat
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试绘制图形时,它说“ matplotlib需要绘制”
vikas@server:~/memory_profiler-0.36$ ./mprof plot --output=plot.png
matplotlib is needed for plotting.
Run Code Online (Sandbox Code Playgroud)
我有想念吗?
我正在分析的函数是其中的run():file_to_be_profiled.py
#!/usr/bin/python
import time
import os, sys, commands
from memory_profiler import profile
from guppy import hpy
@profile
def run():
d = {}
l = []
hp = hpy()
before = hp.heap()
d["k1"] = 'val1'
d["k2"] = 10
count = 0
while (count < 9):
l.append(count)
print 'The count is:', count
count = count + 1
print "Good …Run Code Online (Sandbox Code Playgroud) 在查看Jake van der Plas的"Python数据科学手册"时,我正在重新创建各种调试和分析工具的使用示例.他提供了一个%mprun使用以下函数进行演示的示例:
def sum_of_lists(N):
total = 0
for i in range(5):
L = [j ^ (j >> i) for j in range(N)]
total += sum(L)
del L
return total
Run Code Online (Sandbox Code Playgroud)
我继续在Jupyter笔记本中执行它,并得到以下输出:
Line # Mem usage Increment Line Contents
================================================
1 81.3 MiB 81.3 MiB def sum_of_lists(N):
2 81.3 MiB 0.0 MiB total = 0
3 81.3 MiB 0.0 MiB for i in range(5):
4 113.2 MiB -51106533.7 MiB L = [j ^ (j >> i) for j …Run Code Online (Sandbox Code Playgroud) 我正在为linux下的php开发C模块,我正试图找到一种方法可以帮助我通过最大内存峰值(使用率)来描述我的代码.
使用valgrind我可以在代码中获得总内存分配.但就像分配的内存一样,它来来往往;).我需要得到的是在C应用程序运行期间出现的最高内存使用量,因此我可以全面了解内存需求,并为优化代码提供一些测量点.
有谁知道任何有用的工具/技巧/良好做法?
我试图在这里复制内存使用测试.
从本质上讲,帖子声称给出了以下代码片段:
import copy
import memory_profiler
@profile
def function():
x = list(range(1000000)) # allocate a big list
y = copy.deepcopy(x)
del x
return y
if __name__ == "__main__":
function()
Run Code Online (Sandbox Code Playgroud)
调用
python -m memory_profiler memory-profile-me.py
Run Code Online (Sandbox Code Playgroud)
在64位计算机上打印
Filename: memory-profile-me.py
Line # Mem usage Increment Line Contents
================================================
4 @profile
5 9.11 MB 0.00 MB def function():
6 40.05 MB 30.94 MB x = list(range(1000000)) # allocate a big list
7 89.73 MB 49.68 MB y = copy.deepcopy(x)
8 82.10 MB …Run Code Online (Sandbox Code Playgroud) 我无法解释 C# 进程使用的大部分内存。总内存为 10 GB,但总可达和不可达对象总计为 2.5 GB。我想知道这些 7.5 GB 可能是什么?
我正在寻找最可能的解释或方法来找出这种记忆是什么。
这是确切的情况。进程是.NET 4.5.1。它从互联网下载页面并使用机器学习处理它们。内存几乎完全在托管堆中,如 VMMap 所示。这似乎排除了非托管内存泄漏。

这个过程已经运行了几天,内存慢慢增长。在某些时候,内存为 11 GB。我停止在这个过程中运行的一切。我多次运行垃圾收集,包括大对象堆压缩(间隔一分钟):
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
内存下降到 10 GB。然后我创建转储:
procdump -ma psid
正如预期的那样,转储为 10 GB。
我使用.NET 内存分析器(5.6 版)打开转储。转储显示总共 2.2 GB 可访问对象和 0.3 GB 不可访问对象。剩下的 7.5 GB 可以解释什么?
我一直在想的可能解释:
我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况。该pprof工具显示如下,
Flat Flat% Sum% Cum Cum% Name Inlined?
1.58GB 49.98% 49.98% 1.58GB 49.98% os.ReadFile
1.58GB 49.98% 99.95% 1.58GB 50.02% github.com/bytedance/sonic.(*frozenConfig).Unmarshal
0 0.00% 99.95% 3.16GB 100.00% runtime.main
0 0.00% 99.95% 3.16GB 100.00% main.main
0 0.00% 99.95% 3.16GB 100.00% github.com/spf13/cobra.(*Command).execute
0 0.00% 99.95% 3.16GB 100.00% github.com/spf13/cobra.(*Command).ExecuteC
0 0.00% 99.95% 3.16GB 100.00% github.com/spf13/cobra.(*Command).Execute (inline)
0 0.00% 99.95% 3.16GB 100.00% github.com/mirantis/broker/misc.ParseUcpNodesInspect
0 0.00% 99.95% 3.16GB 100.00% github.com/mirantis/broker/cmd.glob..func3
0 0.00% 99.95% 3.16GB 100.00% github.com/mirantis/broker/cmd.getInfos
0 0.00% 99.95% 3.16GB 100.00% …Run Code Online (Sandbox Code Playgroud) 我使用 jmap 生成了 hprof。
sudo ~/jdk/bin/jmap -F -dump:file=app.hprof 5003
Run Code Online (Sandbox Code Playgroud)
现在,我在 Eclipse 中解析 *.hprof 时遇到 OOM /“Java Heap Space”错误。我想我需要将其作为独立运行。
我该如何运行它?有参考资料吗?