PTVS的内存分配失败及处理

快乐虾

http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)

欢迎转载,但请保留作者信息

PTVS是微软的一个VS插件,用以支持VS下的PYTHON编辑与调试,PTVS在运行时需要依赖于Analyzer生成的数据库,但当python的库文件较多时会出现内存分配失败的异常,类似这样的:

System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
   在 System.Linq.Enumerable.OfTypeIterator[TResult](IEnumerable source)
   在 System.Linq.Enumerable.OfType[TResult](IEnumerable source)
   在 Microsoft.PythonTools.Analysis.Analyzer.DDG.Walk(AssignmentStatement node) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Analyzer\DDG.cs:行号 151
   在 Microsoft.PythonTools.Parsing.Ast.AssignmentStatement.Walk(PythonWalker walker) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Parsing\Ast\AssignmentStatement.cs:行号 39
   在 Microsoft.PythonTools.Analysis.Analyzer.DDG.Walk(SuiteStatement node) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Analyzer\DDG.cs:行号 508
   在 Microsoft.PythonTools.Parsing.Ast.SuiteStatement.Walk(PythonWalker walker) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Parsing\Ast\SuiteStatement.cs:行号 32
   在 Microsoft.PythonTools.Analysis.Analyzer.FunctionAnalysisUnit.AnalyzeWorker(DDG ddg, CancellationToken cancel) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Analyzer\FunctionAnalysisUnit.cs:行号 107
   在 Microsoft.PythonTools.Analysis.AnalysisUnit.Analyze(DDG ddg, CancellationToken cancel) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\AnalysisUnit.cs:行号 142
   在 Microsoft.PythonTools.Analysis.Analyzer.DDG.Analyze(Deque`1 queue, CancellationToken cancel, Action`1 reportQueueSize, Int32 reportQueueInterval) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\Analyzer\DDG.cs:行号 73
   在 Microsoft.PythonTools.Analysis.PythonAnalyzer.AnalyzeQueuedEntries(CancellationToken cancel) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analysis\PythonAnalyzer.cs:行号 837
   在 Microsoft.PythonTools.Analysis.PyLibAnalyzer.Analyze() 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analyzer\PyLibAnalyzer.cs:行号 1181
   在 Microsoft.PythonTools.Analysis.PyLibAnalyzer.Main(String[] args) 位置 f:\projects\src\gdb2012\src\ptvs-2.1\Python\Product\Analyzer\PyLibAnalyzer.cs:行号 166 "C:\USERS\LIGHTS\APPDATA\LOCAL\MICROSOFT\VISUALSTUDIO\12.0EXP\EXTENSIONS\MICROSOFT\PYTHON TOOLS FOR VISUAL STUDIO\2.1\Microsoft.PythonTools.Analyzer.exe" /id {0180036d-fea9-4b98-950d-1253b922ddcc} /version 2.7 /python F:\projects\bin\Win32\Debug\python-2.7.6.exe /library F:\projects\bin\Win32\Debug\Lib\python-2.7 /outdir "C:\Users\lights\AppData\Local\Python Tools\CompletionDB\Debug\12.0\0180036d-fea9-4b98-950d-1253b922ddcc\2.7" /basedb "C:\USERS\LIGHTS\APPDATA\LOCAL\MICROSOFT\VISUALSTUDIO\12.0EXP\EXTENSIONS\MICROSOFT\PYTHON TOOLS FOR VISUAL STUDIO\2.1\CompletionDB" /log "C:\Users\lights\AppData\Local\Python Tools\CompletionDB\Debug\12.0\0180036d-fea9-4b98-950d-1253b922ddcc\2.7\AnalysisLog.txt" /glog "C:\Users\lights\AppData\Local\Python Tools\CompletionDB\Debug\12.0\AnalysisLog.txt" /wait ""

当然,内存分配失败的位置可能会是在不同的位置。

下面记录处理这个问题的过程:

首先删除python库目录下的所有子目录,让PTVS进行一次分析,此时将在C:\Users\lights\AppData\Local\PythonTools\CompletionDB\Debug\12.0\0180036d-fea9-4b98-950d-1253b922ddcc\2.7目录下生成一堆的idb文件。

然后关闭ptvs的自动分析功能:

上面的Automatically generate completion DB onfirst use。

然后单独运行PTVS中的程序Microsoft.PythonTools.Analyzer.exe

Analyzer的运行参数:

/id "0180036d-fea9-4b98-950d-1253b922ddcc"
/version 2.7
/python F:\projects\bin\Win32\Debug\python-2.7.6.exe
/library F:\projects\bin\Win32\Debug\Lib\genlib-2.7\
/outdir "F:\projects\bin\Win32\Debug\Lib\genlibdb-2.7"
/basedb "F:\projects\bin\Win32\Debug\Lib\genlibdb-2.7"
/log "C:\Users\lights\AppData\Local\Python Tools\CompletionDB\Debug\12.0\0180036d-fea9-4b98-950d-1253b922ddcc\2.7\AnalysisLog.txt"
/glog "C:\Users\lights\AppData\Local\Python Tools\CompletionDB\Debug\12.0\AnalysisLog.txt"

执行此命令后将在outdir中生成一堆的idb文件,将这些文件复制到appdata下的目录中,注意如果有同名文件则不覆盖。

逐一处理库的子目录就可以了。

??

时间: 2024-08-25 03:28:46

PTVS的内存分配失败及处理的相关文章

内存充足时,malloc内存分配失败问题

如题,为什么内存充足时,malloc内存分配失败? 首先,在32位平台下,系统最多可管理4G内存,其中2G系统自用,剩下2G可供用户使用,然而在实际分配时,用户可用空间始终小于2G(若有童鞋在如上条件下分配空间 等于或大于2G可以联系我哦,以让我纠正自己的错误).64位则可以管理好多,有兴趣的童鞋可以自己算下哦! 那么,这些跟malloc内存分配失败有什么关系呢有什么关系呢?哈哈,问题就在这里,32位平台下就不多说,相信上面的叙述可以解决童鞋们的问题.在64位平台下,童鞋们是不是发现依旧只能分配

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

【转】C++ 内存分配(new,operator new)详解

本文主要讲述C++ new运算符和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用. 一 new运算符和operator new(): new:指我们在C++里通常用到的运算符,比如A* a = new A;  对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个函数,并不是运算符.对于operator new来说,分为全局重载

Java内存分配以及GC

转自http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html  写的太棒了,简单易懂 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JV

JVM学习之内存分配一

转自:http://blog.csdn.net/mazhimazh/article/details/16879055,多谢博主分享 我们知道计算机的基本构成是:运算器.控制器.存储器.输入和输出设备,那这个JVM也是有这成套的元素,运算器是当然是交给硬件CPU还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM指令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU,比如8086系列的汇编也是可以用在8088上的,但是就不能跑在8051上,而JV

内存分配及清空、调试

1. 存分配的三个方法: (1)      从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)      在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3)      从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用fre

STL容器的内存分配

这篇文章参考的是侯捷的<STL源码剖析>,所以主要介绍的是SGI STL实现版本,这个版本也是g++自带的版本,另外有J.Plauger实现版本对应的是cl自带的版本,他们都是基于HP实现的版本,有兴趣可以翻翻最新的源码头文件开始处有声明. /* * * Copyright (c) 1994 * Hewlett-Packard Company(这里) * * Permission to use, copy, modify, distribute and sell this software *

JAVA模拟内存分配与释放——首次适应算法

前言 首次适应算法(FF,first fit)是内存基于顺序搜索的动态分配分区算法,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后在按照作业的大小从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中.若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回. 该算法倾向于优先利用内存中低地址部分的空闲分区,从而保留了高地址部分不断被划分.这为以后到达的大作业分配大的的内存空间创造了条件.其缺

c内存分配(转)

图示 C内存分配 程序代码区 存放函数体的二进制代码 全局数据区 全局变量和静态变量的存储是放在一起的.初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 常量数据存放在另一个区域里.这些数据在程序结束后由系统释放.我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称 栈区 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式