将python列表和字典设置为None需要花费大量时间

时间:2014-02-03 10:31:52

标签: python garbage-collection

我有这段代码:

        rows_to_process = EulerNightlyDBQueries.fetchRowsToProcess(cur_date, Config.config_dict['settings']['Performance']['euler_nightly_rows_to_process'], Config.config_dict['settings']['Data']['recover_mode'])
        mac_uniques_hour, \
        emp_mac_uniques_hour, \
        mac_uniques_hour_monthly = EulerNightlyDBQueries.fetchMacUniquesByDate(cur_date)

        #Start processing raw rows from receiver table
        try:
            RawProcessor.startRawProcessor(cur_date, mac_uniques_hour, emp_mac_uniques_hour, rows_to_process)
            emp_mac_uniques_hour = None
            rows_to_process = None

注意'rows_to_process'(来自数据库的行列表)和'emp_mac_uniques_hour'(来自数据库的值字典)。

假设我为每一行提取了800,000行。 当我这样做时:

emp_mac_uniques_hour = None
rows_to_process = None

需要45-120秒!! 是不是只是将列表和字典的引用更改为None? 为什么这么长时间...... ??

我这样做是为了让GC在我完成它们之后能够收集它们。 顺便说一下,我正在使用python 2.7.6

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我这样做是为了让GC能够在我之后收集它们   完成它们..顺便说一句,我使用的是python 2.7.6

这不是CPython的GC的工作原理。它主要进行引用计数,并且只将标记式GC作为检测引用循环的最后手段。因此,如果这是对象的最后一个引用,则将其设置为None将释放对象(依此类推)。

如果您希望将必要的GC工作推迟到以后,您可以创建另一个数据引用,并在以后将 设置为None。或者我想你可以尝试设计参考循环,但这似乎很复杂。

不过,对于我来说,在数百万的数据库行中,我感觉很多。