From 7b1ef7085ab07da7a05240de773f1405fdcd1746 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 27 Oct 2014 14:08:08 +0100 Subject: [PATCH] [IMP] fields: reduce the number of attributes on _column instances This is a memory optimization: instead of setting all attributes on all instances, set them with their default value on the class, and only set specific ones on instances. This reduces the memory footprint of around 14Mb per registry with modules crm, sale, purchase and stock installed. --- openerp/osv/fields.py | 76 ++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 30fe1f9a5eb..9506a5ca4fa 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -83,7 +83,28 @@ class _column(object): _symbol_set = (_symbol_c, _symbol_f) _symbol_get = None _deprecated = False - copy = True # whether the field is copied by BaseModel.copy() + + copy = True # whether value is copied by BaseModel.copy() + string = None + help = "" + required = False + readonly = False + _domain = [] + _context = {} + states = None + priority = 0 + change_default = False + size = None + ondelete = None + translate = False + select = False + manual = False + write = False + read = False + selectable = True + group_operator = False + groups = False # CSV list of ext IDs of groups + deprecated = False # Optional deprecation warning def __init__(self, string='unknown', required=False, readonly=False, domain=None, context=None, states=None, priority=0, change_default=False, size=None, ondelete=None, translate=False, select=False, manual=False, **args): """ @@ -92,33 +113,28 @@ class _column(object): It corresponds to the 'state' column in ir_model_fields. """ - if domain is None: - domain = [] - if context is None: - context = {} - self.states = states or {} - self.string = string - self.readonly = readonly - self.required = required - self.size = size - self.help = args.get('help', '') - self.priority = priority - self.change_default = change_default - self.ondelete = ondelete.lower() if ondelete else 'set null' - self.translate = translate - self._domain = domain - self._context = context - self.write = False - self.read = False - self.select = select - self.manual = manual - self.selectable = True - self.group_operator = args.get('group_operator', False) - self.groups = False # CSV list of ext IDs of groups that can access this field - self.deprecated = False # Optional deprecation warning + args0 = { + 'string': string, + 'required': required, + 'readonly': readonly, + '_domain': domain, + '_context': context, + 'states': states, + 'priority': priority, + 'change_default': change_default, + 'size': size, + 'ondelete': ondelete.lower() if ondelete else None, + 'translate': translate, + 'select': select, + 'manual': manual, + } + for key, val in args0.iteritems(): + if val: + setattr(self, key, val) + self._args = args - for a in args: - setattr(self, a, args[a]) + for key, val in args.iteritems(): + setattr(self, key, val) # prefetch only if self._classic_write, not self.groups, and not # self.deprecated @@ -150,6 +166,8 @@ class _column(object): base_items = [ ('column', self), # field interfaces self ('copy', self.copy), + ] + truthy_items = filter(itemgetter(1), [ ('index', self.select), ('manual', self.manual), ('string', self.string), @@ -160,8 +178,6 @@ class _column(object): ('groups', self.groups), ('change_default', self.change_default), ('deprecated', self.deprecated), - ] - truthy_items = filter(itemgetter(1), [ ('size', self.size), ('ondelete', self.ondelete), ('translate', self.translate), @@ -620,6 +636,8 @@ class many2one(_column): _symbol_f = lambda x: x or None _symbol_set = (_symbol_c, _symbol_f) + ondelete = 'set null' + def __init__(self, obj, string='unknown', auto_join=False, **args): _column.__init__(self, string=string, **args) self._obj = obj