2014-12-27 49 views
0

我有一個長時間運行的Python進程,它使用Django ORM對付Oracle數據庫。cx_Oracle - Django ORM - 引用計數增加

進程的大小不斷增加。

我正在使用mem_top分析這個過程,我發現一個特定數據類型的引用計數隨迭代次數不斷增加。

數據類型爲[{u'time ':u'0.004',u'sql ':u'QUERY = U \' SELECT 「RANGE_STATUS」「我

參考從534增加至53295。

這份名單似乎有幾乎所有使用的ORM

這是否意味着存在cx_Oracle模塊或Django的ORM某處內存泄漏執行的查詢?

這是兩次迭代相隔10分鐘的memtop結果。

警告:27/12/2014下午5時45分46秒:

refs: 
9500 <type 'dict'> {'TAPE_DRIVE_FORMAT': -1610612736, 'SLE_ERROR': 1, 'IMAGE_REL_I386_SEC 
8410 <type 'list'> [('200', '343045', 1321), ('200', '343046', 1322), ('200', '343047', 1 
1578 <type 'dict'> {'logging.atexit': None, 'django.core.files.errno': None, 'django.test 
1567 <type 'list'> ['mem_top', 'mem_top', 'datetime', 'datetime', 'sys', 'string', 'os', 
688 <type 'dict'> {'FILE_SYSTEM_ATTR': 2, 'GetDriveTypeW': <built-in function GetDriveTy 
688 <type 'dict'> {'FILE_SYSTEM_ATTR': 2, 'GetDiskFreeSpaceEx': <built-in function GetDi 
534 <type 'list'> [{u'time': u'0.004', u'sql': u'QUERY = u\'SELECT "RANGE_STATUS"."I 
510 <type 'dict'> {'GetDiskFreeSpaceEx': <built-in function GetDiskFreeSpaceEx>, 'SetThr 
510 <type 'dict'> {'GetDiskFreeSpaceEx': <built-in function GetDiskFreeSpaceEx>, 'SetThr 
370 <type 'list'> [<weakref at 01CF5030; to 'type' at 1E228030 (type)>, <weakref at 01CF 
types: 
8625  <type 'function'> 
3778  <type 'tuple'> 
3128  <type 'dict'> 
1672  <type 'list'> 
1661  <type 'cell'> 
1440  <type 'weakref'> 
1351  <type 'wrapper_descriptor'> 
1103  <type 'builtin_function_or_method'> 
888 <type 'type'> 
734 <type 'getset_descriptor'> 

警告:27/12/2014下午5時54分37秒:

refs: 
53295 <type 'list'> [{u'time': u'0.004', u'sql': u'QUERY = u\'SELECT "RANGE_STATUS"."I 
9500 <type 'dict'> {'TAPE_DRIVE_FORMAT': -1610612736, 'SLE_ERROR': 1, 'IMAGE_REL_I386_SEC 
8410 <type 'list'> [('200', '343045', 1321), ('200', '343046', 1322), ('200', '343047', 1 
1578 <type 'dict'> {'logging.atexit': None, 'django.core.files.errno': None, 'django.test 
1567 <type 'list'> ['mem_top', 'mem_top', 'datetime', 'datetime', 'sys', 'string', 'os', 
749 <type 'list'> ['A. HISTORY OF THE SOFTWARE', '==========================', '', 'Pyth 
688 <type 'dict'> {'FILE_SYSTEM_ATTR': 2, 'GetDriveTypeW': <built-in function GetDriveTy 
688 <type 'dict'> {'FILE_SYSTEM_ATTR': 2, 'GetDiskFreeSpaceEx': <built-in function GetDi 
510 <type 'dict'> {'GetDiskFreeSpaceEx': <built-in function GetDiskFreeSpaceEx>, 'SetThr 
510 <type 'dict'> {'GetDiskFreeSpaceEx': <built-in function GetDiskFreeSpaceEx>, 'SetThr 
types: 
8625  <type 'function'> 
3778  <type 'tuple'> 
3130  <type 'dict'> 
1675  <type 'list'> 
1661  <type 'cell'> 
1440  <type 'weakref'> 
1351  <type 'wrapper_descriptor'> 
1103  <type 'builtin_function_or_method'> 
888 <type 'type'> 
734 <type 'getset_descriptor'> 

請指導。

回答

0

原來,在我的Django設置中,我有Debug = True。 。 。把它變成False解決了這個問題。使用Debug = True django內部構建了一個列表,我認爲這個列表具有過多的引用計數。

+0

重要的是要記住,在打開DEBUG的情況下運行時,Django會記住它執行的每個SQL查詢。這在調試時非常有用,但它會在生產服務器上快速佔用內存。 – Guddu