Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python内存使用率不会下降_Python 2.7_Memory_Twisted_Perspective Broker - Fatal编程技术网

Python 2.7 Python内存使用率不会下降

Python 2.7 Python内存使用率不会下降,python-2.7,memory,twisted,perspective-broker,Python 2.7,Memory,Twisted,Perspective Broker,我正在编写一个twisted PB应用程序,它似乎使用了大量的内存,当用户断开连接时,这些内存似乎永远不会被释放 我有一个pb.Root对象,客户端连接到该对象并调用一个远程方法,该方法返回一个pb.Referenceable对象。当创建该对象以加快操作时,该对象会将大量信息读取到内存中(大约2GB的数据)。此对象以及有关客户端的一些其他信息被插入到列表中 当客户机与服务器断开连接时,我对该对象调用一些清理操作,以删除对正在存储的缓存对象的引用。chunkCache是我存储数据的目录 def d

我正在编写一个twisted PB应用程序,它似乎使用了大量的内存,当用户断开连接时,这些内存似乎永远不会被释放

我有一个pb.Root对象,客户端连接到该对象并调用一个远程方法,该方法返回一个pb.Referenceable对象。当创建该对象以加快操作时,该对象会将大量信息读取到内存中(大约2GB的数据)。此对象以及有关客户端的一些其他信息被插入到列表中

当客户机与服务器断开连接时,我对该对象调用一些清理操作,以删除对正在存储的缓存对象的引用。chunkCache是我存储数据的目录

def disconnected(self):
    self.connected = False
    self.chunkCache = None
    self.cur.close()
一旦客户端根据top never drops断开了内存使用,它仍然会显示2Gb

我应该担心这一点,还是在需要时会释放分配的内存,或者如果没有任何想法,如何释放内存?它是在创建对象时创建的,不会传递到其他任何地方

在该对象中,我确实有一个deferToThread调用,这是否会停止正在释放的项

我正在Linux上使用python 2.7

更新:

我很困惑,我刚刚在我的对象中添加了自定义的
\uuu del\uuu
方法,并在其中添加了一个print语句,它们正在被删除,那么为什么内存使用率从未下降呢

谢谢


Dean

在大多数当前操作系统上,动态内存的分配发生在通常称为堆的地方(不要与同名的数据结构混淆),这基本上只是一个连续区域,从某个基址开始,扩展到基址加上堆的当前大小。进程从一个小堆开始(通常只有几页),并通过以系统页面大小的正整数倍为单位向上扩展段来根据需要增长。在该空间中,分配/释放创建更小的内存块以满足程序的需要,以及分配器跟踪分配的内存和未分配的内存所需的元数据。随着时间的推移,这些较小的内存片段可能会被释放,使堆段基本上为空,但除非对其进行专门编码,否则堆段很少收缩。因此,一个长时间运行的进程似乎有一个堆段,其大小与其峰值使用量相同。如果需要为其他进程释放物理内存,则正在使用但不再使用的页面将倾向于移开以交换,但进程映像仍然显示为“大”,并且通常不会在不重新启动的情况下收缩。使用其他内存分配机制(例如,将临时文件映射为内存空间,并在映射完成后取消映射并删除它)有多种方法,但程序需要专门编码才能实现这一点。使用C或C++编写的应用程序,使用标准库分配例程(<代码> Malc C/代码> /<代码>免费< /COD>或<代码>新< /代码> /<代码>删除< /代码>,包括Python编译器/解释器,将显示上述行为。

这有很多意义,并且似乎模仿了我的应用程序的行为。当一个客户机重新连接时,内存使用量只会增加大约100Mb,而当第二个客户机断开连接时,内存使用量会下降一点。当我做一些诊断来计算所有对象的大小时,结果是大约400MB,这是一个更合理的结果。所以你认为我可以放心地假设我的应用程序没有问题?