Apache Ignite: Pojo против BinaryObject

У меня есть настраиваемый объект, который я конвертирую в BinaryObject (используя BinaryObjectBuilder) перед тем, как поместить его в кеш зажигания.

Глубокий размер моего настраиваемого объекта составляет около 500 байт, размер BinaryObject - колоссальные ~ 8 МБ, а размер данных, которые фактически отправляются на сервер Ignite, составляет ~ 300 байт.

Поскольку BinaryObject - это то, как Ignite хранит данные внутри, каковы плюсы и минусы создания BinaryObject на клиенте и отправки ему на сервер, а не отправки pojo и разрешения серверу внутренне преобразовать его в BinaryObject? Недостатком создания BinaryObject на клиенте является то, что я использую ~ 8,5 МБ ОЗУ для хранения ОДНОГО BinaryObject в куче jvm клиента, которая будет намного меньше, чем куча jvm сервера.

Как вы измерили размер объекта? Что, если вы создадите 10 таких объектов, они займут 80 МБ?

maaartinus 16.04.2018 00:40

Я использовал JOL для измерения размера объекта. Правильно, каждый из моих объектов размером около 500 байт превратился в объект размером ~ 8 МБ, поэтому 10 будет занимать 80 МБ.

CaptainHastings 16.04.2018 02:45

JOL = openjdk.java.net/projects/code-tools/jol

CaptainHastings 16.04.2018 02:45

Я ожидал, что 8 МБ будут какими-то общими данными. В противном случае в этом нет никакого смысла. Конечно, там есть какие-то метаданные или предварительно выделенная память (но даже в этом случае это слишком много). Я бы не доверял JOL здесь и измерял потребляемую кучу, когда создается много объектов. Другая возможность может заключаться в том, что совместному использованию препятствует способ создания объектов. Вам действительно стоит опубликовать код и вывод JOL. Попытайтесь упростить проблему, используя более простой объект, чтобы вы могли найти виновника. Ни один разумный инструмент не взорвет все объекты с коэффициентом 16000 - это сделает его полностью непригодным для использования.

maaartinus 16.04.2018 05:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
455
1

Ответы 1

Это дубликат Раздутие двоичного объекта Apache Ignite

Объекты не становятся размером 8 МБ, когда вы конвертируете их в BinaryObjects. Каждый BinaryObject хранит ссылки на некоторые общие данные, которые одинаковы для каждого объекта. И эти данные не передаются по сети.

Попробуйте проанализировать дамп кучи с помощью инструмента, который может построить дерево доминаторов. Вы увидите, что сохраненный размер вашего BinaryObject составляет около 300 байтов, а не 8 мегабайт.

Другие вопросы по теме