##// END OF EJS Templates
cull 20% when display hook is full...
Min RK -
Show More
@@ -15,7 +15,7 b' from IPython.core.formatters import _safe_get_formatter_method'
15 from IPython.config.configurable import Configurable
15 from IPython.config.configurable import Configurable
16 from IPython.utils import io
16 from IPython.utils import io
17 from IPython.utils.py3compat import builtin_mod
17 from IPython.utils.py3compat import builtin_mod
18 from IPython.utils.traitlets import Instance
18 from IPython.utils.traitlets import Instance, Float
19 from IPython.utils.warn import warn
19 from IPython.utils.warn import warn
20
20
21 # TODO: Move the various attributes (cache_size, [others now moved]). Some
21 # TODO: Move the various attributes (cache_size, [others now moved]). Some
@@ -30,10 +30,10 b' class DisplayHook(Configurable):'
30 """
30 """
31
31
32 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
32 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
33 cull_fraction = Float(0.2)
33
34
34 def __init__(self, shell=None, cache_size=1000, **kwargs):
35 def __init__(self, shell=None, cache_size=1000, **kwargs):
35 super(DisplayHook, self).__init__(shell=shell, **kwargs)
36 super(DisplayHook, self).__init__(shell=shell, **kwargs)
36
37 cache_size_min = 3
37 cache_size_min = 3
38 if cache_size <= 0:
38 if cache_size <= 0:
39 self.do_full_cache = 0
39 self.do_full_cache = 0
@@ -178,13 +178,7 b' class DisplayHook(Configurable):'
178 # Avoid recursive reference when displaying _oh/Out
178 # Avoid recursive reference when displaying _oh/Out
179 if result is not self.shell.user_ns['_oh']:
179 if result is not self.shell.user_ns['_oh']:
180 if len(self.shell.user_ns['_oh']) >= self.cache_size and self.do_full_cache:
180 if len(self.shell.user_ns['_oh']) >= self.cache_size and self.do_full_cache:
181 warn('Output cache limit (currently '+
181 self.cull_cache()
182 repr(self.cache_size)+' entries) hit.\n'
183 'Flushing cache and resetting history counter...\n'
184 'The only history variables available will be _,__,___ and _1\n'
185 'with the current result.')
186
187 self.flush()
188 # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise
182 # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise
189 # we cause buggy behavior for things like gettext).
183 # we cause buggy behavior for things like gettext).
190
184
@@ -243,6 +237,21 b' class DisplayHook(Configurable):'
243 self.log_output(format_dict)
237 self.log_output(format_dict)
244 self.finish_displayhook()
238 self.finish_displayhook()
245
239
240 def cull_cache(self):
241 """Output cache is full, cull the oldest entries"""
242 oh = self.shell.user_ns.get('_oh', {})
243 sz = len(oh)
244 cull_count = max(int(sz * self.cull_fraction), 2)
245 warn('Output cache limit (currently {sz} entries) hit.\n'
246 'Flushing oldest {cull_count} entries.'.format(sz=sz, cull_count=cull_count))
247
248 for i, n in enumerate(sorted(oh)):
249 if i >= cull_count:
250 break
251 self.shell.user_ns.pop('_%i' % n, None)
252 oh.pop(n, None)
253
254
246 def flush(self):
255 def flush(self):
247 if not self.do_full_cache:
256 if not self.do_full_cache:
248 raise ValueError("You shouldn't have reached the cache flush "
257 raise ValueError("You shouldn't have reached the cache flush "
General Comments 0
You need to be logged in to leave comments. Login now