hydrus/hydrus/core/HydrusMemory.py

101 lines
2.0 KiB
Python

import collections
from hydrus.core import HydrusData
try:
import pympler
from pympler import asizeof
from pympler import muppy
from pympler import summary
from pympler import classtracker
from pympler import tracker
PYMPLER_OK = True
except:
PYMPLER_OK = False
CURRENT_TRACKER = None
# good examples here:
# https://pympler.readthedocs.io/en/latest/muppy.html#muppy
# this can do other stuff, class tracking and even charts with matplotlib
# pretty sure the Client should only ever call this stuff on the GUI thread of course, since it'll be touching Qt stuff
def CheckPymplerOK():
if not PYMPLER_OK:
raise Exception( 'Pympler is not available!' )
def PrintCurrentMemoryUse( classes_to_track = None ):
CheckPymplerOK()
HydrusData.Print( '---printing memory use to log---' )
all_objects = muppy.get_objects()
sm = summary.summarize( all_objects )
summary.print_( sm, limit = 500 )
HydrusData.DebugPrint( '----memory-use snapshot done----' )
if classes_to_track is None:
return
HydrusData.Print( '----printing class use to log---' )
ct = classtracker.ClassTracker()
for o in all_objects:
if isinstance( o, classes_to_track ):
ct.track_object( o )
ct.create_snapshot()
ct.stats.print_summary()
HydrusData.DebugPrint( '-----class-use snapshot done----' )
def PrintSnapshotDiff():
CheckPymplerOK()
global CURRENT_TRACKER
if CURRENT_TRACKER is None:
TakeMemoryUseSnapshot()
HydrusData.Print( '---printing memory diff to log--' )
diff = CURRENT_TRACKER.diff()
summary.print_( diff, limit = 500 )
HydrusData.DebugPrint( '----memory-use snapshot done----' )
def TakeMemoryUseSnapshot():
global CURRENT_TRACKER
CURRENT_TRACKER = tracker.SummaryTracker()