From eeecedbdf93485e2e123a3ed2c697f2892981ef1 Mon Sep 17 00:00:00 2001 From: c-bata Date: Sun, 4 Apr 2021 15:07:08 +0900 Subject: [PATCH 1/3] Reduce the size of attr values --- optuna_dashboard/serializer.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/optuna_dashboard/serializer.py b/optuna_dashboard/serializer.py index e164ff78..4959b7ac 100644 --- a/optuna_dashboard/serializer.py +++ b/optuna_dashboard/serializer.py @@ -1,4 +1,3 @@ -import json from typing import Any, Dict, List, Tuple from optuna.distributions import BaseDistribution @@ -11,6 +10,7 @@ except ImportError: from typing_extensions import TypedDict +MAX_ATTR_LENGTH = 128 Attribute = TypedDict( "Attribute", { @@ -35,7 +35,21 @@ TrialParam = TypedDict( def serialize_attrs(attrs: Dict[str, Any]) -> List[Attribute]: - return [{"key": k, "value": json.dumps(v)} for k, v in attrs.items()] + serialized = [] + for k, v in attrs.items(): + value: str + if isinstance(v, str): + value = v[:MAX_ATTR_LENGTH] if len(v) > MAX_ATTR_LENGTH else v + elif isinstance(v, (bool, float, int)): + value = str(v) + elif isinstance(v, bytes): + value = "" + elif v is None: + value = "None" + else: # unsupported type + continue + serialized.append({"key": k, "value": value}) + return serialized def serialize_intermediate_values(values: Dict[int, float]) -> List[IntermediateValue]: From 882bf806d5c3a63d027aa12f60b7121d146e550b Mon Sep 17 00:00:00 2001 From: c-bata Date: Sun, 4 Apr 2021 15:23:40 +0900 Subject: [PATCH 2/3] Add tests --- optuna_dashboard/serializer.py | 2 +- tests/test_serializers.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tests/test_serializers.py diff --git a/optuna_dashboard/serializer.py b/optuna_dashboard/serializer.py index 4959b7ac..7b05bf22 100644 --- a/optuna_dashboard/serializer.py +++ b/optuna_dashboard/serializer.py @@ -35,7 +35,7 @@ TrialParam = TypedDict( def serialize_attrs(attrs: Dict[str, Any]) -> List[Attribute]: - serialized = [] + serialized: List[Attribute] = [] for k, v in attrs.items(): value: str if isinstance(v, str): diff --git a/tests/test_serializers.py b/tests/test_serializers.py new file mode 100644 index 00000000..45724782 --- /dev/null +++ b/tests/test_serializers.py @@ -0,0 +1,17 @@ +from unittest import TestCase +from optuna_dashboard.serializer import serialize_attrs + + +class SerializeAttrsTestCase(TestCase): + def test_serialize_bytes(self) -> None: + serialized = serialize_attrs({"bytes": b"This is a bytes object."}) + self.assertEqual(serialized[0]["value"], "") + + def test_serialize_string(self) -> None: + for length in [100, 128, 150]: + with self.subTest(f"length: {length}"): + value = "a" * length + serialized = serialize_attrs({ + "key": value, + }) + self.assertLessEqual(len(serialized[0]["value"]), 128) From f0dd075940adb1b98739a8b7df77f25f481cf667 Mon Sep 17 00:00:00 2001 From: c-bata Date: Sun, 4 Apr 2021 15:25:02 +0900 Subject: [PATCH 3/3] Run black --- tests/test_serializers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_serializers.py b/tests/test_serializers.py index 45724782..d95f6f9a 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -11,7 +11,9 @@ class SerializeAttrsTestCase(TestCase): for length in [100, 128, 150]: with self.subTest(f"length: {length}"): value = "a" * length - serialized = serialize_attrs({ - "key": value, - }) + serialized = serialize_attrs( + { + "key": value, + } + ) self.assertLessEqual(len(serialized[0]["value"]), 128)