diff --git a/requirements.txt b/requirements.txt index 6b39ddd3859dbf67082222cd3a8915786d6dedfc..8f3d12d3e7e7409ebb738b1d623cfe1d6c83bacf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,3 @@ seaborn vre-middleware >=1.2.4 jupyter_client ipykernel -pympler diff --git a/setup.cfg b/setup.cfg index 95587fd243c266a9f7573b09d930b5f439eb905b..ebf7b726267f3fb2d3a814d374a6edca666b7967 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,7 +57,6 @@ install_requires = vre-middleware >=1.2.4 jupyter_client ipykernel - pympler [options.extras_require] test = diff --git a/src/virtmat/language/interpreter/session_manager.py b/src/virtmat/language/interpreter/session_manager.py index a0bae94ff2806dfd9fcf20639fabdb203640d248..0f097643f12ae604148cb5cd1e78b6c518a8140f 100644 --- a/src/virtmat/language/interpreter/session_manager.py +++ b/src/virtmat/language/interpreter/session_manager.py @@ -110,7 +110,9 @@ def get_prettytable(dataframe): table = class_(list(dataframe.columns)) for tpl in dataframe.itertuples(index=False, name=None): table.add_row(tpl) - return str(table) + table.align = 'l' + table.max_width = 120 + return table class SessionManager(InteractiveConsole): diff --git a/src/virtmat/language/utilities/fireworks.py b/src/virtmat/language/utilities/fireworks.py index 65bf4232c549aa1373d3774ceef7b993719badc3..1a0e671c4f646a201dde9c792810c1fbb73a3b99 100644 --- a/src/virtmat/language/utilities/fireworks.py +++ b/src/virtmat/language/utilities/fireworks.py @@ -348,14 +348,15 @@ def get_model_nodes(lpad, uuid): def get_model_history(lpad, uuid): """return node history with some node attributes as pandas dataframe""" - dct = {'state': [], 'updated_on': [], 'source': []} + dct = {'State': [], 'Updated on': [], 'Statement': []} for fwk in get_model_nodes(lpad, uuid): if fwk['spec']['_source_code']: - dct['state'].append(fwk['state']) - dct['updated_on'].append(get_iso_datetime(fwk['updated_on'])) - dct['source'].append('; '.join(fwk['spec']['_source_code'])) - df = pandas.DataFrame(dct).sort_values('updated_on').sort_values('state') - return df[['state', 'updated_on', 'source']] + dct['State'].append(fwk['state']) + timestamp = get_iso_datetime(fwk['updated_on'], add_tzinfo=False, sep=' ') + dct['Updated on'].append(timestamp) + dct['Statement'].append('; '.join(fwk['spec']['_source_code'])) + df = pandas.DataFrame(dct).sort_values('Updated on') + return df[['Updated on', 'State', 'Statement']] # pylint: disable=E1136 def get_model_tag(lpad, uuid): @@ -398,7 +399,7 @@ def get_models_overview(lpad, uuids): wf_states = [] for wf in wfs: hist = get_model_history(lpad, wf['metadata']['uuid']) - wf_states.append(dict(Counter(hist['state'].tolist()))) + wf_states.append(dict(Counter(hist['State'].tolist()))) df_2 = pandas.DataFrame(wf_states).fillna(0).astype('int64') df_2.rename(lambda x: x[0:3], axis='columns', inplace=True) df_3 = get_models_tags(lpad, uuids) diff --git a/src/virtmat/language/utilities/serializable.py b/src/virtmat/language/utilities/serializable.py index 0454578e3ee9c0f3870efabc2d8899978c6428e0..291ccda718f959300e3521abe4b941d2d0f67b84 100644 --- a/src/virtmat/language/utilities/serializable.py +++ b/src/virtmat/language/utilities/serializable.py @@ -1,10 +1,11 @@ """serialization/deserialization code""" -from dataclasses import dataclass import typing +from dataclasses import dataclass +from json import JSONEncoder +from itertools import islice import numpy import pandas import pint_pandas -from pympler import asizeof from fireworks.utilities.fw_serializers import FWSerializable from fireworks.utilities.fw_serializers import serialize_fw from fireworks.utilities.fw_serializers import recursive_serialize @@ -45,6 +46,18 @@ def versioned_serialize(func): return decorator +def get_json_size(obj, max_size): + """compute JSON size in bytes of a JSON serializable object up to max_size""" + gen = JSONEncoder().iterencode(obj) + chunk_size = 1024 + json_size = 0 + next_chunk = len(''.join(islice(gen, chunk_size)).encode()) + while next_chunk and json_size < max_size: + json_size += next_chunk + next_chunk = len(''.join(islice(gen, chunk_size)).encode()) + return json_size + + @dataclass class FWDataObject(FWSerializable): """top-level FWSerializable dataclass to hold any FWSerializable objects""" @@ -57,21 +70,31 @@ class FWDataObject(FWSerializable): @recursive_serialize @versioned_serialize def to_dict(self): + f_name = f'{__name__}.{self.__class__.__name__}.to_dict()' + logger = get_fw_logger(f_name) + logger.debug('%s: starting', f_name) if self.datastore is None: - logger = get_fw_logger(__name__) - mem_size = asizeof.asizeof(self.value) - logger.debug('%s: size in memory: %s', __name__, mem_size) - if mem_size < ioops.DATASTORE_CONFIG['inline-threshold']: + dct = recursive_dict(self.value) + b_thres = ioops.DATASTORE_CONFIG['inline-threshold'] + b_size = get_json_size(dct, b_thres) + logger.debug('%s: data type: %s', f_name, type(self.value)) + logger.debug('%s: data size [B]: %s', f_name, b_size) + logger.debug('%s: inline-threshold [B]: %s', f_name, b_thres) + if b_size < b_thres: self.datastore = {'type': None} - return {'value': self.value, 'datastore': self.datastore} - logger.info('%s: inline data limit exceeded: %s', __name__, mem_size) - self.datastore, self.filename = ioops.offload_data(recursive_dict(self.value)) + logger.info('%s: data not offloaded', f_name) + return {'value': dct, 'datastore': self.datastore} + logger.info('%s: inline data limit exceeded: %s', f_name, b_size) + self.datastore, self.filename = ioops.offload_data(dct) if self.datastore['type'] is None: - logger.info('%s: data not offloaded', __name__) + logger.info('%s: data not offloaded', f_name) else: - logger.info('%s: data offloaded in %s', __name__, self.filename) + logger.info('%s: data offloaded in %s', f_name, self.filename) if self.datastore['type'] is None: + logger.debug('%s: datastore: %s', f_name, self.datastore) return {'value': self.value, 'datastore': self.datastore} + logger.debug('%s: datastore: %s', f_name, self.datastore) + logger.debug('%s: data in file: %s', f_name, self.filename) return {'datastore': self.datastore, 'filename': self.filename} @classmethod diff --git a/src/virtmat/language/utilities/textx.py b/src/virtmat/language/utilities/textx.py index e7d2dfe8b270df8a4aa6ecf214b56326551f9e85..d692e80e4b33fe75043020218d990c97084be9ef 100644 --- a/src/virtmat/language/utilities/textx.py +++ b/src/virtmat/language/utilities/textx.py @@ -142,7 +142,7 @@ def display_exception(func): return func(*args, **kwargs) except Exception as err: print('\n', file=sys.stderr) - traceback.print_exception(err, file=sys.stderr) + traceback.print_exception(*sys.exc_info(), file=sys.stderr) print('\n', file=sys.stderr) raise err return decorator