DEV_EASY_NOTES Telegram 453
Расскажу про свой проеб с памятью. Делал я одну систему для импакт анализа. В этой системе нужно было хранить Coverage, чтобы потом по нему определять, какие тесты были затронуты. Изначально структура представляла собой вот такой json:

{
"ru.package.SomeClassName": [
{
"line_number": 1,
"tests": [
{"testId": 1},
{"testId": 2}]
}
]
}

Я упростил структуру, чтобы впихнуть в пост, но суть сохранил. Поясняю: для каждого класса мы храним номера строк, и у каждой строки — массив объектов-тестов.

Загадка от Жака Фреско: где тут проблема?

Проблема в том, что у каждой строки мы храним именно объекты, которые ещё и дублируются для каждой строки. Стоит добавить какое-то поле в этот объект — и размер этого JSON сразу улетает в космос. Первая версия структуры весила 1 ГБ.

Фикс заключается в том, что мы выносим объекты тестов в отдельный массив, а в строках оставляем только ID. Это уже позволило сократить размер в 4 раза.

Затем я подумал: «Вот, Google же придумал более оптимальный формат — Protobuf. Бинарный формат, который вообще должен ещё в разы сократить Coverage».

Я был мал и глуп, не видал больших залуп, поэтому просто перевёл структуру на Protobuf. В kotlinx serialization это делается просто подключением зависимости.

После Protobuf структура стала весить около 200 МБ. Не значительная экономия памяти, но неплохо. Я решил, что это максимум, который можно выжать. Инфра у нас быстрая, Coverage скачивался за секунды, и я не видел смысла что-то ещё копать.

До того момента, пока не пришёл матёрый iOS-ник и не сказал:

— Ты шо, ебанутый? Почему просто не использовал gzip?

Честно говоря, у меня не было ответа на этот вопрос. Я почему-то думал, что Protobuf эффективнее gzip. Однако на самом деле Protobuf вообще не про компрессию — он вообще другие проблемы решает.

Попробовал я gzip на нашей структуре. Угадаете результат?

Да, 20 МБ.

Дэээ… Что сказать… Скиллов убавилось, количество хромосом возросло.

Поэтому перед переходом на модные структуры пробуйте для начала дедовские методы — они чаще всего работают лучше.



tgoop.com/dev_easy_notes/453
Create:
Last Update:

Расскажу про свой проеб с памятью. Делал я одну систему для импакт анализа. В этой системе нужно было хранить Coverage, чтобы потом по нему определять, какие тесты были затронуты. Изначально структура представляла собой вот такой json:

{
"ru.package.SomeClassName": [
{
"line_number": 1,
"tests": [
{"testId": 1},
{"testId": 2}]
}
]
}

Я упростил структуру, чтобы впихнуть в пост, но суть сохранил. Поясняю: для каждого класса мы храним номера строк, и у каждой строки — массив объектов-тестов.

Загадка от Жака Фреско: где тут проблема?

Проблема в том, что у каждой строки мы храним именно объекты, которые ещё и дублируются для каждой строки. Стоит добавить какое-то поле в этот объект — и размер этого JSON сразу улетает в космос. Первая версия структуры весила 1 ГБ.

Фикс заключается в том, что мы выносим объекты тестов в отдельный массив, а в строках оставляем только ID. Это уже позволило сократить размер в 4 раза.

Затем я подумал: «Вот, Google же придумал более оптимальный формат — Protobuf. Бинарный формат, который вообще должен ещё в разы сократить Coverage».

Я был мал и глуп, не видал больших залуп, поэтому просто перевёл структуру на Protobuf. В kotlinx serialization это делается просто подключением зависимости.

После Protobuf структура стала весить около 200 МБ. Не значительная экономия памяти, но неплохо. Я решил, что это максимум, который можно выжать. Инфра у нас быстрая, Coverage скачивался за секунды, и я не видел смысла что-то ещё копать.

До того момента, пока не пришёл матёрый iOS-ник и не сказал:

— Ты шо, ебанутый? Почему просто не использовал gzip?

Честно говоря, у меня не было ответа на этот вопрос. Я почему-то думал, что Protobuf эффективнее gzip. Однако на самом деле Protobuf вообще не про компрессию — он вообще другие проблемы решает.

Попробовал я gzip на нашей структуре. Угадаете результат?

Да, 20 МБ.

Дэээ… Что сказать… Скиллов убавилось, количество хромосом возросло.

Поэтому перед переходом на модные структуры пробуйте для начала дедовские методы — они чаще всего работают лучше.

BY Dev Easy Notes


Share with your friend now:
tgoop.com/dev_easy_notes/453

View MORE
Open in Telegram


Telegram News

Date: |

Users are more open to new information on workdays rather than weekends. Add up to 50 administrators Today, we will address Telegram channels and how to use them for maximum benefit. Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day. In the next window, choose the type of your channel. If you want your channel to be public, you need to develop a link for it. In the screenshot below, it’s ”/catmarketing.” If your selected link is unavailable, you’ll need to suggest another option.
from us


Telegram Dev Easy Notes
FROM American