我有这段代码:
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
谢谢!
答案 0 :(得分:1)
我这样做是为了让GC能够在我之后收集它们 完成它们..顺便说一句,我使用的是python 2.7.6
这不是CPython的GC的工作原理。它主要进行引用计数,并且只将标记式GC作为检测引用循环的最后手段。因此,如果这是对象的最后一个引用,则将其设置为None
将释放对象(依此类推)。
如果您希望将必要的GC工作推迟到以后,您可以创建另一个数据引用,并在以后将 设置为None。或者我想你可以尝试设计参考循环,但这似乎很复杂。
不过,对于我来说,在数百万的数据库行中,我感觉很多。