tgoop.com/dev_easy_notes/453
Create:
Last Update:
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