我最近对算法感兴趣,并开始通过编写一个简单的实现,然后以各种方式优化它来探索它们.
我已经熟悉用于分析运行时的标准Python模块(对于大多数事情我已经发现IPython中的timeit魔术功能已足够),但我也对内存使用感兴趣,所以我也可以探索这些权衡(例如,缓存先前计算的值表的成本与根据需要重新计算它们的成本.是否有一个模块可以为我分析给定函数的内存使用情况?
我有一个Python程序,它运行一系列实验,没有数据打算从一个测试存储到另一个测试.我的代码包含一个我完全无法找到的内存泄漏(我看看内存泄漏的其他线程).由于时间限制,我不得不放弃寻找泄漏,但如果我能够隔离每个实验,程序可能会运行足够长的时间来产生我需要的结果.
具体情况详情
更新
Gnibbler的答案实际上让我发现我的ClosenessCalculation对象存储了每次计算中使用的所有数据都没有被删除.然后我用它来手动删除一些似乎已修复内存问题的链接.
我正在python中编写一些蜘蛛并使用lxml库来解析html和gevent库以进行异步.我发现在经过一段时间的工作之后,lxml解析器开始占用内存高达8GB(所有服务器内存).但我只有100个异步线程,每个线程解析文件最大为300kb.
我测试并在lxml.html.fromstring中启动该问题,但我无法重现此问题.
这行代码中的问题:
HTML = lxml.html.fromstring(htmltext)
Run Code Online (Sandbox Code Playgroud)
也许有人知道它可能是什么,或锄头来解决这个问题?
感谢帮助.
PS
Linux Debian-50-lenny-64-LAMP 2.6.26-2-amd64 #1 SMP Tue Jan 25 05:59:43 UTC 2011 x86_64 GNU/Linux
Python : (2, 6, 6, 'final', 0)
lxml.etree : (2, 3, 0, 0)
libxml used : (2, 7, 8)
libxml compiled : (2, 7, 8)
libxslt used : (1, 1, 26)
libxslt compiled : (1, 1, 26)
Run Code Online (Sandbox Code Playgroud)
UP:
我为使用lxml解析器的进程设置了ulimit -Sv 500000和uliit -Sm 615000.
现在有一段时间他们开始写错误日志:
"忽略"错误"lxml.etree._BaseErrorLog._receive中的异常MemoryError:MemoryError()".
并且我无法捕获此异常,因此它会在日志中递归写入此消息,因为磁盘上有可用空间.
我怎样才能捕获这个异常以杀死进程,所以守护进程可以创建新进程?
所以我使用 Python 作为前端 GUI,它与一些 C 文件交互以作为后端进行存储和内存管理。每当 GUI 的窗口关闭或退出时,我都会为分配的变量调用所有析构函数方法。
无论如何,在退出整个程序以确保没有任何内存泄漏之前,是否可以检查内存泄漏或可用性,例如 C Valgrind 检查?
示例退出:
from tkinter import *
root = Tk() # New GUI
# some code here
def destructorMethods:
myFunctions.destructorLinkedList() # Destructor method of my allocated memory in my C file
# Here is where I would want to run a Valgrind/Memory management check before closing
root.destroy() # close the program
root.protocol("WM_DELETE_WINDOW", destructorMethods) # When the close window option is pressed call destructorMethods function
Run Code Online (Sandbox Code Playgroud) 我刚刚安装了孔雀鱼0.1.10.然后输入Ipython 2.1.0
from guppy import hpy
hp = hpy()
Run Code Online (Sandbox Code Playgroud)
使控制台崩溃,即Windows告诉我,python.exe刚刚崩溃.有没有解决方法?还是一个堆积的替代品?
Python脚本生成分段错误我找不到问题的根源。如何在 Python 中简单地调试段错误?是否有推荐的编码实践来避免分段错误?
我编写了一个脚本(1600 行)来系统地从源下载 CSV 文件并格式化收集的数据。该脚本对于 100-200 个文件非常有效,但一段时间后它会系统性地崩溃并显示分段错误消息。
- 崩溃总是发生在脚本中的同一位置,没有可理解的原因 - 我在 Mac OSX 上运行它,但崩溃也会发生在 Ubuntu Linux 和 Debian 9 上 - 如果我运行在单个文件上的脚本期间崩溃的 Pandas 例程,他们工作正常。仅当我循环脚本 100-200 次时才会发生崩溃。-我检查了每个变量内容、构造函数(init),它们似乎都很好。
代码太长,无法粘贴,但按需提供
预期的结果应该是执行到底。相反,它会在 100-200 次迭代后崩溃
我有一个带有 256MB RAM 的嵌入式 Linux 系统。有一个大型代码库在其上运行,大多数使用 C++,但一些实用程序使用 Python。我们有一个 Python“包管理器”,它使用Python apt 模块处理系统更新(我们将更新分发为 .deb 文件)。运行时,此应用程序使用系统 RAM 的很大一部分。我正在使用 top 监视 RAM 使用情况,查看 Python 进程的 RSS(也许这不是分析进程内存使用情况的有效方法?向建议开放)。
线
缓存 = apt.Cache()
定期调用以检查系统状态似乎每次调用都会消耗大约 20MB,并且看起来没有返回此内存。我尝试在函数末尾删除缓存对象并运行 gc.collect(),这似乎没有多大帮助。
如何减少此程序的内存使用量?
平台为ARM Cortex A8,运行Linux 3.2、Debian Wheezy和Python 2.7.3。