强制Python释放对象以释放内存

强制Python释放对象以释放内存,python,memory,Python,Memory,我正在运行以下代码: from myUtilities import myObject for year in range(2006,2015): front = 'D:\\newFilings\\' back = '\\*\\dirTYPE\\*.sgml' path = front + str(year) + back sgmlFilings = glob.glob(path) for each in sgmlFilings: head

我正在运行以下代码:

from myUtilities import myObject
for year in range(2006,2015):
    front = 'D:\\newFilings\\'
    back = '\\*\\dirTYPE\\*.sgml'
    path = front + str(year) + back
    sgmlFilings = glob.glob(path)
    for each in sgmlFilings:
        header = myObject(each)
        try:
            tagged = header.process_tagged('G:')
        except Exception as e:
            outref = open('D:\\ProblemFiles.txt','a')
            outref.write(each '\n')
            outref.close()
            print each
如果从重启开始,python的内存分配/消耗相当小。随着时间的推移,虽然它显著增加,但最终在大约一天之后,我几乎没有可用内存(安装了24GB[294 mb免费23960缓存]),而Python在Windows任务管理器列表中占用的内存是3GB。在对文件集合运行代码所需的三天时间里,我一直在关注这一增长

我的印象是,既然我做每件事都是和

tagged = header.process_tagged('G:')
与每个循环关联的内存将被释放并被垃圾回收

我能做些什么来强制释放这段记忆吗。虽然我还没有运行统计数据,但通过观察磁盘上的活动可以看出,随着时间的推移(以及内存~lump~变大),进程会变慢

编辑

我看了下面提到的问题,我不认为这些问题与我在另一个问题中理解的问题相同,因为它们抓住了对象(三角形列表),需要整个列表进行计算。在每个循环中,我读取一个文件,对该文件执行一些处理,然后将其写回磁盘。然后我在读下一个文件

关于可能的内存泄漏,我在myObject中使用LXML

注意,自从这个问题的第一次迭代以来,我添加了MyUtilities import myObject中的行。MyUtilities包含执行所有操作的代码

关于发布我的myUtilities代码——这避开了基本问题——我已经完成了标题和标记,在每次迭代之后,标记完成任务并将结果写入另一个驱动器,事实上是一个新格式化的驱动器

我考虑过使用多处理,但我没有这样做,因为我有一个模糊的想法,即由于这是如此I/O密集,我将竞争驱动器头-也许这是错误的,但由于每次迭代都需要我写几百MB的文件,我认为我将竞争写入或甚至读取时间

更新-所以我在myObjectclass中有一个案例,其中一个文件是用

myString=open(somefile).read()

我把它改成了

打开(somefile,'r')作为句柄:

`    myString = fHandle.read()`
(很抱歉格式化-仍在努力)

然而,这并没有明显的影响,当我开始一个新的周期时,我有4000 mb的缓存内存,在22分钟和处理27K文件后,我有大约26000 mb的缓存内存

我很感激下面所有的答案和评论,并且一整天都在阅读和测试各种东西。我将更新这个,因为我认为这个任务将需要一个星期,现在看起来可能需要一个多月

我不断收到关于代码其余部分的问题。然而,它有800多行,对我来说,这有点脱离了中心问题

于是创建了myObject的一个实例 然后,我们将myObject中包含的方法应用于头文件

这基本上就是文件转换。文件被读入,部分文件的副本被制作并写入磁盘

对我来说,中心问题是,显然,无论是标题还是标记,都存在一些持久性。在开始下一个循环之前,如何处理与标题或标记相关的所有内容

在过去的14个小时左右,我一直在运行代码。当它完成第一个循环时,处理27K文件大约需要22分钟,现在处理大约相同数量的文件需要一个半小时

仅运行gc.collect不起作用。我停止了程序,在解释器中尝试了一下,但我在内存统计数据中没有看到任何移动

在阅读下面的memoryallocator描述后进行编辑我认为缓存中占用的数量不是问题所在,而是运行python进程占用的数量。所以新的测试是从命令行运行代码。我将继续观察和监控,并将在看到发生的情况后发布更多信息

编辑:仍在挣扎,但已将代码设置为从bat文件运行,其中包含一个循环
sgmlfiles
(见上文)中的数据。批处理文件如下所示

python batch.py
python batch.py
 .
 .
 .

batch.py首先读取一个队列文件,该文件包含一个要glob的目录列表,它从列表中删除第一个目录,更新列表并保存它,然后运行
标题
标记
进程。很笨拙,但由于每次迭代后python.exe都会关闭,因此python从不积累内存,因此进程以一致的速度运行

您可以使用模块对这些东西进行一定程度的控制。具体来说,您可以尝试合并

gc.collect() 

在循环体中。

原因是CPython的内存管理。Python管理内存的方式使长时间运行的程序变得困难。当使用del语句显式释放对象时,CPython必然不会将分配的内存返回给操作系统。它保留内存以备将来进一步使用。解决此问题的一种方法是使用多处理模块,在完成作业后终止该进程并创建另一个进程。通过这种方式,您可以强制释放内存,操作系统必须释放该子进程使用的内存。 我也有同样的问题。随着时间的推移,内存使用过度增加,系统变得不稳定且无响应。我对信号和psutil使用了不同的技术来解决这个问题。例如,当您有一个循环并且需要在堆栈上分配和取消分配数据时,通常会出现此问题

您可以在此处阅读有关Python内存分配器的更多信息:

此工具还非常有助于分析内存使用情况:

还有一件事,将插槽添加到myObject中,看起来您的对象中有固定的插槽,这也有助于减少ram使用。无