在Python中优化内存使用:del obj或gc.collect()?

时间:2014-04-18 02:39:12

标签: python memory garbage-collection

我有一个python脚本来分析日志文件中的用户行为。

这个脚本使用file.readlines()从几个大文件(每个大约50 GB)中读取,然后逐行分析它们并将结果保存在python对象的dict中,在分析完所有行之后,dict写入磁盘。

由于我有一个具有64个内核和96 GB内存的服务器,我启动了此脚本的10个进程,每个进程处理部分数据。此外,为了节省IO操作所花费的时间,我使用file.readlines(MAX_READ_LIMIT)而不是file.readline()并设置MAX_READ_LIMIT = 1 GB。

在使用top命令显示任务资源的同时在服务器上运行此脚本后,我发现虽然我的脚本的每个进程只占用大约3.5 GB的内存(总共40 GB),但是只剩下380 MB服务器(服务器上没有同时运行其他重要的内存消耗应用程序。)

所以,我想知道内存在哪里?应该留下大约96-40 = 36GB的内存?

如果我在上述观察中犯了一些错误,请告诉我。

一个假设是未使用的内存不会立即放回内存池中,所以我想知道如何明确地立即释放未使用的内存

我从python文档中了解到在python中管理内存有两种互补的方法:垃圾收集和引用计数,并根据python doc:

  

由于收集器补充了已经使用的引用计数   Python,如果你确定你的程序,你可以禁用收集器   不会创建参考周期。

那么,我应该使用哪一个,del obj或gc.collect()?

1 个答案:

答案 0 :(得分:3)

  

使用file.readlines(),然后逐行分析数据

这是一个糟糕的设计。 readlines读取整个文件并返回Python字符串列表。如果您只需要逐行处理数据,则在不使用readlines的情况下遍历文件:

with open(filename) as f:
    for line in f:
        # process line

这将大大减少程序所需的内存量。