我想找出在调用函数期间(在Python中)分配的最大RAM量是多少。还有其他与跟踪RAM使用情况有关的问题:
建议使用哪个Python内存分析器?
如何剖析Python中的内存使用情况?
但是这些似乎允许您在heap()
调用方法(例如guppy)时更多地跟踪内存使用情况。但是,我要跟踪的是外部库中的一个函数,该函数无法修改,并且会逐渐占用大量RAM,但是一旦函数执行完成,就可以释放它。有什么方法可以找出函数调用期间使用的RAM总量是多少?
这个问题似乎很有趣,它使我有理由研究Guppy / Heapy,对此我表示感谢。
我尝试了大约2个小时,让Heapy监视函数调用/进程,而又没有 零 运气地修改其源代码。
我确实找到了一种使用内置Python库完成任务的方法resource
。请注意,文档没有指出RU_MAXRSS
值返回的内容。另一个SO用户注意到它在kB中。运行Mac
OSX 7.3并看着我的系统资源在下面的测试代码中攀升,我相信返回的值以 字节为单位 ,而不是千 字节 。
我如何使用resource
库来监视库调用的10000英尺视图是在一个单独的(可监视的)线程中启动该函数,并在主线程中跟踪该进程的系统资源。下面是您需要运行以对其进行测试的两个文件。
图书馆资源监视器 -
whatever_you_want.py
import resource
import time
from stoppable_thread import StoppableThread
class MyLibrarySniffingClass(StoppableThread):
def __init__(self, target_lib_call, arg1, arg2):
super(MyLibrarySniffingClass, self).__init__()
self.target_function = target_lib_call
self.arg1 = arg1
self.arg2 = arg2
self.results = None
def startup(self):
# Overload the startup function
print "Calling the Target Library Function..."
def cleanup(self):
# Overload the cleanup function
print "Library Call Complete"
def mainloop(self):
# Start the library Call
self.results = self.target_function(self.arg1, self.arg2)
# Kill the thread when complete
self.stop()
def SomeLongRunningLibraryCall(arg1, arg2):
max_dict_entries = 2500
delay_per_entry = .005
some_large_dictionary = {}
dict_entry_count = 0
while(1):
time.sleep(delay_per_entry)
dict_entry_count += 1
some_large_dictionary[dict_entry_count]=range(10000)
if len(some_large_dictionary) > max_dict_entries:
break
print arg1 + " " + arg2
return "Good Bye World"
if __name__ == "__main__":
# Lib Testing Code
mythread = MyLibrarySniffingClass(SomeLongRunningLibraryCall, "Hello", "World")
mythread.start()
start_mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
delta_mem = 0
max_memory = 0
memory_usage_refresh = .005 # Seconds
while(1):
time.sleep(memory_usage_refresh)
delta_mem = (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) - start_mem
if delta_mem > max_memory:
max_memory = delta_mem
# Uncomment this line to see the memory usuage during run-time
# print "Memory Usage During Call: %d MB" % (delta_mem / 1000000.0)
# Check to see if the library call is complete
if mythread.isShutdown():
print mythread.results
break;
print "\nMAX Memory Usage in MB: " + str(round(max_memory / 1000.0, 3))
停止的主题 -
stoppable_thread.py
import threading
import time
class StoppableThread(threading.Thread):
def __init__(self):
super(StoppableThread, self).__init__()
self.daemon = True
self.__monitor = threading.Event()
self.__monitor.set()
self.__has_shutdown = False
def run(self):
'''Overloads the threading.Thread.run'''
# Call the User's Startup functions
self.startup()
# Loop until the thread is stopped
while self.isRunning():
self.mainloop()
# Clean up
self.cleanup()
# Flag to the outside world that the thread has exited
# AND that the cleanup is complete
self.__has_shutdown = True
def stop(self):
self.__monitor.clear()
def isRunning(self):
return self.__monitor.isSet()
def isShutdown(self):
return self.__has_shutdown
###############################
### User Defined Functions ####
###############################
def mainloop(self):
'''
Expected to be overwritten in a subclass!!
Note that Stoppable while(1) is handled in the built in "run".
'''
pass
def startup(self):
'''Expected to be overwritten in a subclass!!'''
pass
def cleanup(self):
'''Expected to be overwritten in a subclass!!'''
pass
问题内容: 我正在尝试跟踪处理URL的脚本的内存使用情况。基本思想是在将另一个URL添加到cURL多处理程序之前,检查是否存在合理的缓冲区。我正在使用“滚动cURL”概念,该概念在多处理程序运行时处理URL数据。这意味着我可以在每次处理和删除现有URL时通过从池中添加新URL来保持N个连接处于活动状态。 我已经使用了一些积极的结果。添加该标志很有帮助(虽然并不清楚“系统”内存和“ emalloc”
问题内容: 我在Linux中玩ptrace。我正在尝试使用/ proc / pid / mem接口编写跟踪进程的内存。 我用来完成此任务的功能是: 但是我总是会得到错误:编写:错误的文件描述符。 是否可以使用此方法编写跟踪过程? 问题答案: 您正在以只读模式()打开文件。我建议改用: 但是,从目前尚不清楚这是否可行: memory through open(2), read(2), and lse
问题内容: 我试图找出在以下情况下“ maxmemory”的安全设置: 大量写入的应用程序 8GB RAM 假设其他进程占用约1GB 这意味着redis进程的内存使用量不得超过7GB 每个BGSAVE事件的内存使用量都会增加一倍,原因是: 在redis 文档中,有关BGSAVE事件的内存使用量增加的说法如下: 如果要在写入量很大的应用程序中使用Redis,则在将RDB文件保存在磁盘上或重写AOF日
Xdebug允许你记录所有的函数调用数据(包括参数和返回值)到不同格式的文件。 之所以称之为函数跟踪,是因为它可以帮助你在使用新的应用程序,或者当你试图找出应用程序运行时到底发生了什么。函数跟踪还可以选择显示传递给函数和方法的变量的值,并返回值。在默认跟踪中,这两个元素不可用。 输出格式 有三种输出格式。第一种是人类可读的调用栈,第二种更适合计算机程序,因为它更容易解析,最后一种使用HTML格式化
简介 Logify能够接受一个.h头文件作为输入,然后输出.xm文件(MobileSubstrate扩展),这个.xm文件hook这个类的所有方法,当这些方法被调用的时候打印log。这有助于你发现哪些方法被调用了。Logify在安装了Theos之后就有。 用法 在命令行下输入类似的命令: /opt/theos/bin/logify.pl MomoLocationManager.h > tweak.
由于Session是服务端对象,浏览器要想使用某个服务端的Session对象,就必须在请求消息中包含该Session对象的SessionID。该SessionID一般被放到HTTP请求消息头的Cookie字段中,Cookie名称是JSESSIONID。下面的例子揭示了通过Cookie来跟踪Session的底层技术,读者可以从该例子中充分了解Cookie和Session的关系。 例子 : 通过Coo