Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

11.02.2023

Пост про компактне подання даних

Пост про компактне подання даних. Варто уявляти, яка оптимальна форма для кожного типу даних, та скільки місця він займає. Це я кажу як людина, яка в школі зберігала піксельну графіку в текстових файлах: 0 1 15 1 0. Якщо зберігати числа у тестовому файлі здається безглуздим, нагадаю, що формат JSON був би ще менш ефективним. Це свідчить про те, що сучасні програмісти не звикли думати, скільки займають їх дані. Та це чудово — але деколи доводиться. Наприклад, на масштабі — якщо умовний запис буде повторюватись мільярд разів, то марна трата одного байту вже виллється в втрачений гігабайт.

Перший урок з JSON - не треба зберігати дані в рядках тексту. Очевидно, для чисел є числові типи. Але є чисельні типи даних, які теж влазять в число. Наприклад, дати. Або IP адреси. Або кольори. Також часто можна обрати не найбільший числовий тип - тобто менш ніж 64 біти. Для булевих значень достатньо одного байту, для IP-адрес - чотири. Також ми звикли відображати двійкові рядки як текст, у вигляді Hex або Base64 - можна заощадити, якщо цього не робити. Наприклад, UUID замість 36 байтів тексту влізе в 16 байтів двійкових даних.

Рядки теж можна зберігати компактніше, якщо їх стискати, або ж просто використавши словник — є багато текстових даних, які мають обмежений набір значень.

Окремо про дати, я колись непогано виграв на використанні памʼяті у додатку на JavaScript, коли почав зберігати дати як числа, та створювати обʼєкти тільки за потребою. Це тому, що число — набагато компактніша форма.

А ще число — не завжди найкомпактніша форма подання. Мій улюблений приклад — зберігання множини чисел у вигляді бітової мапи. У такій формі біт в розряді N позначає, чи не міститься N в множині. Так можна досягнути економії місця в 32 рази. Не кажучи про те, що операції над бітовими мапами набагато швидше… але про це розкажу іншим разом.