快乐虾
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下的目录中,注意如果有同名文件则不覆盖。
逐一处理库的子目录就可以了。