SlideShare a Scribd company logo
Оптимизация работы
с данными в мобильных
приложениях
Святослав Иванов, Артём Миронов
«Едадил»
• Агрегируем информацию о специальных предложениях
в магазинах
• Показываем самое выгодное поблизости –
можно использовать поиск, сортировки и сравнение цен
• Собираем все персональные предложения и купоны
• Даём инструменты для отслеживания интересного
• Помогаем составить универсальный список покупок
и поделиться им с семьёй и друзьями
Мобильное приложение
про выгодные повседневные покупки
Рост аудитории
Какие мобильные приложения нравятся?
• Понятный интерфейс
• Отзывчивость в работе
• Плавные переходы, анимация
Сначала обычно всё хорошо
Молодцы
Спасибо вам большое
Отличная, нужная программа!
Отлично
Приложение очень полезное!
Супер, отличная программа!
Красавы
Отличное приложение
Наращиваем функциональность…
После последнего обновления стал тормозить.
Каталоги не загружаются
Испортили после обновления
Перестала грузиться. Очень долго думает...
Жалею, что обновил
Старая версия была удобнее, похоже, сделали
обновление ради обновления. Придётся искать
предыдущие версии
Тормоза!!!
Бог ты мой, да отключите вы это
позиционирование, дистанцию до магазина
в метрах все и так знают. У меня телефон,
а не сервер Пентагона. Мамо мия.
И еще наращиваем…
С каждым обновлением приложение грузится всё дольше
и дольше. А теперь стало вылетать каждые 5 мин. Обидно.
Отвратительное приложение. Не загружается нормально
Фото не загружаются!!!
Верните как было! Приложение тормозит по-страшному!!!
Зря потратил время
Господи, как же оно тормозит! Даже желание пропало
знакомиться с предложенными возможностями! Тормозит
Приложение раньше летало, пользуюсь больше
года! Сейчас постоянно висит и вылетает. Удалила
Хватит это терпеть!
Как мы «разгоняли» Едадил
Видео девайса
с процессом
загрузки?
Проблемы:
• загрузка данных стала занимать вечность
• приложение стало слишком медлительным
Что делать:
• уменьшить время загрузки
• уменьшить лаги интерфейса
Рост контента
Устройства наших пользователей
73%
Android
Топ устройств
Galaxy S3 Neo 2,87%
Galaxy Grand Prime 2,56%
Galaxy A3 2,12%
Galaxy S4 Mini 1,91%
Galaxy A5 1,85%
Galaxy S4 1,60%
Galaxy S3 1,56%
Galaxy J1 1,30%
Galaxy S5 1,23%
Galaxy A5(2016) 1,19%
Топ версий Android
>= 5.0
57%
4.4.x
26%
< 4.4
17%
Структура API Едадила
1. получаем список id каталогов и магазинов поблизости
edapi.net/locationInfo?lat=55.75&lng=37.62
2. получаем список акций (содержимое каталогов)
edapi.net/catalogs?ids=121,122,123
Процесс загрузки данных
Время
locationInfo catalog 1 catalog 2 catalog 3 catalog n Update UI…
locationInfo
catalog 2
catalog 1
catalog 3
catalog n
Update UI Update UI
…


Оптимизация по этапам загрузки
Ожидание ответа сервера Десериализация Обработка данных
• Оптимизация бэкенда
• Кэширование на бэкенде
• Кэширование на клиенте
• Более быстрый формат
данных (Protobuf)
• Оптимизация кода
fun loadLocationInfo(loc: Location) {
api.getLocationInfo(lat, lon)
.subscribeOn(Schedulers.newThread())
.subscribe {
updateLocationInfo(it)
notifyUI()
loadCatalogs(it.catalogsIds)
}
}
Загрузка списка id каталогов поблизости
fun loadLocationInfo(loc: Location) {
api.getLocationInfo(round(lat, 2), round(lon, 2))
.subscribeOn(Schedulers.newThread())
.subscribe {
updateLocationInfo(it)
notifyUI()
loadCatalogs(it.catalogsIds)
}
}
Загрузка списка id каталогов поблизости
fun loadCatalogs(ids: List<Int>) {
val observables = ids.map {
api.getCatalogs(it)
}
Single.zip(observables, { it }).subscribeOn(Schedulers.newThread())
.subscribe {
updateCatalogs(it)
notifyUI()
}
}
Содержимое каталогов
Schedulers.newThread()
fun loadCatalogs(ids: List<Int>) {
val observables = ids.map {
api.getCatalogs(it).subscribeOn(Schedulers.newThread())
}
Single.zip(observables, { it })
.subscribe {
updateCatalogs(it)
notifyUI()
}
}
Schedulers.io()
fun loadCatalogs(ids: List<Int>) {
val observables = ids.map {
api.getCatalogs(it).subscribeOn(Schedulers.io())
}
Single.zip(observables, { it })
.subscribe {
updateCatalogs(it)
notifyUI()
}
}
Какой scheduler выбрать?
• Schedulers.newThread()
• Schedulers.io()
• Schedulers.from(Executors.newFixedThreadPool(5))
• Schedulers.from(
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
)
• Schedulers.from(
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2)
)
Schedulers.from(...)
fun loadCatalogs(ids: List<Int>) {
val observables = ids.map {
api.getCatalogs(it).subscribeOn(scheduler)
}
Single.zip(observables, { it })
.subscribe {
updateCatalogs(it)
notifyUI()
}
}
Форматы передачи данных
• Текстовые форматы — XML, JSON
+ универсальные, с ним умеет работать всё; подходят для многих применений
– сериализация-десериализация не самые быстрые
• Бинарные вариации на тему JSON —BJSON, MessagePack
+ компактнее, чем текстовые; быстрее десериализуются
• Protocol buffers
– есть ограничения по типам данных
Почему мы выбрали Protobuf
• быстрая десериализация
• человекочитаемость нам не нужна
• лучше «обфусцированность», чем у MessagePack
Сравнение форматов сериализации
https://github.com/eishay/jvm-serializers/wiki
• гарантия обратной совместимости
* А потом мы узнали про FlatBuffers
Бенчмарки
Samsung Galaxy S4 (2 cpus), 3G интернет, ~100 каталогов,
минимальная обработка данных, сервер отдает кэш
18
12
11
10
13
6
5
5
Последовательно
Параллельно Schedulers.newThread()
Параллельно Schedulers.io()
Параллельно newFixedThreadPool
JSON (gson) Protobuf (Wire)
Что, если объединить запросы?
edapi.net/catalogs?ids=121,122,123
10
8
9
5
4
6
1 каталог
10 каталогов
Все каталоги
JSON (gson) Protobuf (Wire)
HTTP/2
 OkHttp на Android 5.0+
Пишем полученное на локальную ФС
Время


catalog 1 catalog 2 catalog 3 catalog 4 catalog 5 catalog1.json
catalog2.json
catalog3.json
catalog4.json
catalog5.jsoncatalog 1
catalog 2
catalog 3
catalog 4
catalogs.protobuf
Как хранить полученное на устройстве
• Файлы с исходными данными
+ просто; один алгоритм обработки для локальных и удаленных данных
– только для малого объема; нужно подготавливать данные при каждом запуске
• Файлы с предварительно обработанными данными
+ обрабатываем один раз, потом просто используем
– всё равно приходится считывать в память весь объем данных
• Решения, специфичные для платформы (e.g. Core Data)
+ оперируем готовыми объектами; скорость работы на чтение
– не все гладко с производительностью при записи; в целом — pain in the ass
Как хранить полученное на устройстве
• SQLite
+ структурированное хранилище;
+ гибкий язык запросов;
+ не держим всё в памяти, достаём данные порциями по надобности;
+ предварительную обработку (сортировку, группировку, фильтрацию) осуществляет СУБД;
+ нативная реализация для большинства платформ;
– не всегда удобно работать с объектами — по-хорошему, не помешает ORM.
Как хранить полученное на устройстве
• NoSQL-базы и вариации на тему
+ как правило, быстрее, чем SQLite;
+ документоориентированная структура придает гибкости;
+ часто идут в комплекте с ORM;
+ можно передавать на вход JSON, который сразу ложится в базу;
+ есть решения с синхронизацией данных;
– бывают проблемы с многопоточностью;
– встречаются подводные камни, специфичные для реализации.
Эволюция хранилища Едадила на iOS
SQLite + FMDB
• структура БД аналогична таковой на сервере;
• самописное подобие ORM;
• стабильно и предсказуемо, но все обертки приходится писать самому.
Core Data +
MagicalRecord
• работать с сущностями стало удобнее;
• производительность при записи больших объемов проседает;
• в целом весьма капризное поведение.
Realm
• курсоры, уведомления;
• очень простые миграции;
• производительность радует;
Оптимизация кода - updateCatalogs
class Item {
val id = 1234
val categoryId = 12
val retailerId = 3
val dateEnd = "2016-12-31T01:00:00",
...
}
TimeUtils.compareDates(now, TimeUtils.strToCalendar(item.dateEnd)) >= 0
nowStr.compareTo(item.dateEnd.take(10)) >= 0
Оптимизация кода - updateCatalogs
class Item {
val id = 1234
val categoryId = 12
val retailerId = 3
val dateEnd = "2016-12-31T01:00:00",
...
}
class MyItem {
val id = 1234
val category: Category
val retailer: Retailer
val dateEnd = "2016-12-31T01:00:00",
...
}
class ItemData {
val category: Category
val retailer: Retailer
...
}
model.getItemData(item).category ?
Оптимизация кода — логи
android.util.Log.d("tag", "something " + arg)
Оптимизация кода — логи
Utils.log("tag", "something " + arg)
fun log(message: String) {
if (BuildConfig.DEBUG) {
android.util.Log.d("tag", message)
}
}
Оптимизация кода — логи
Utils.log("tag", "something %s", arg)
fun log(message: String, vararg args: Any?) {
if (BuildConfig.DEBUG) {
android.util.Log.d("tag", message.format(*args))
}
}
Выводы
• Думайте о будущем приложения с самого начала
Выпустить сначала простейшую версию — это правильно.
Но если полетело, то лучше не затягивать с переработкой потенциально слабых мест.
• Если все же затянули с доработками
Обязательно запланируйте отдельный технический релиз (или серию).
Пользователи не всегда жаждут новые фичи, а вот ожившее приложение точно оценят.
• Учитесь на чужих ошибках
Спасибо за внимание!
Какие ещё бывают проблемные места
• Длинные списки — таблицы, коллекции
• Формирование данных для списка
• Конструкция ячейки
• Работа с графикой
• Асинхронная загрузка изображений
• Используем кэш на устройстве
• Целевая подготовка изображений
• Аналитика
• Разумное количество событий, их параметров и логики
Решения по загружаемым данным
• Структурирование передаваемых через API данных
• Не стремимся повторить структуру серверного хранилища
• Не проецируем структуру данных на интерфейс (и наоборот)
• Количество запросов
• Зависимость одних запросов от результата выполнения других
• Объем передаваемых данных
• Приложение-терминал или приложение-СУБД?
• Работа в оффлайне
• Для мобильных приложений — отдельный API
Что используют в Android
• http-клиент (OkHttp + Retrofit)
• JSON (GSON, Jackson, Moshi)
• Protocol Buffers (Wire)
• Другие форматы и библиотеки (MessagePack, BJSON)
• Изображения (Picasso, GLide, UIL, Fresco)
• RxJava

More Related Content

What's hot

Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Ontico
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
Daniel Podolsky
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
Nikolay Sivko
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Ontico
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Ontico
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Ontico
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Ontico
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Ontico
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Mail.ru Group
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 

What's hot (20)

Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
 

Viewers also liked

Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
Ontico
 
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
Ontico
 
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
Ontico
 
Побеждаем мейнфрейм / Андрей Николаенко (IBS)
Побеждаем мейнфрейм / Андрей Николаенко (IBS)Побеждаем мейнфрейм / Андрей Николаенко (IBS)
Побеждаем мейнфрейм / Андрей Николаенко (IBS)
Ontico
 
Опыт построения СХД на базе Windows Server для использования в публичном обла...
Опыт построения СХД на базе Windows Server для использования в публичном обла...Опыт построения СХД на базе Windows Server для использования в публичном обла...
Опыт построения СХД на базе Windows Server для использования в публичном обла...
Ontico
 
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
Ontico
 
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Ontico
 
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
Ontico
 
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Ontico
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Ontico
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Ontico
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Ontico
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
Ontico
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
Ontico
 
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Ontico
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
Ontico
 
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
Ontico
 
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
Ontico
 

Viewers also liked (20)

Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
Сайт под управлением ERP или ERP под управлением сайта / Станислав Гоц (Lamod...
 
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
 
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
Evaluation of High Availability Performance of Kubernetes and Docker Swarm on...
 
Побеждаем мейнфрейм / Андрей Николаенко (IBS)
Побеждаем мейнфрейм / Андрей Николаенко (IBS)Побеждаем мейнфрейм / Андрей Николаенко (IBS)
Побеждаем мейнфрейм / Андрей Николаенко (IBS)
 
Опыт построения СХД на базе Windows Server для использования в публичном обла...
Опыт построения СХД на базе Windows Server для использования в публичном обла...Опыт построения СХД на базе Windows Server для использования в публичном обла...
Опыт построения СХД на базе Windows Server для использования в публичном обла...
 
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
 
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
 
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
Testing applications with traffic control in containers / Alban Crequy (Kinvolk)
 
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
Измеряем энергопотребление с помощью Arduino / Алексей Лавренюк (Яндекс)
 
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
 
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
A/Б-тестирование: от сегментирования до профита / Кирилл Котов (Superjob)
 
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
RTB в телевизоре и на улицах / Михаил Мельников (IPONWEB)
 

Similar to Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артём Миронов (Едадил)

Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...
Ontico
 
Druid - Interactive Analytics At Scale
Druid - Interactive Analytics At ScaleDruid - Interactive Analytics At Scale
Druid - Interactive Analytics At Scale
Lohika_Odessa_TechTalks
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
iQSpace
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
Roman Dvornov
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
Badoo Development
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
Илья Середа
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
"Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7""Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7"
Badoo Development
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунета
CEE-SEC(R)
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
Fwdays
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42
DevDay
 
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и..."Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
it-people
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам? Andrey Korshikov
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 

Similar to Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артём Миронов (Едадил) (20)

Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...
 
Druid - Interactive Analytics At Scale
Druid - Interactive Analytics At ScaleDruid - Interactive Analytics At Scale
Druid - Interactive Analytics At Scale
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
"Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7""Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7"
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунета
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42
 
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и..."Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
SQL Server Analysis Services 2014: табличная модель - альтернатива кубам?
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артём Миронов (Едадил)

  • 1. Оптимизация работы с данными в мобильных приложениях Святослав Иванов, Артём Миронов «Едадил»
  • 2. • Агрегируем информацию о специальных предложениях в магазинах • Показываем самое выгодное поблизости – можно использовать поиск, сортировки и сравнение цен • Собираем все персональные предложения и купоны • Даём инструменты для отслеживания интересного • Помогаем составить универсальный список покупок и поделиться им с семьёй и друзьями Мобильное приложение про выгодные повседневные покупки
  • 4. Какие мобильные приложения нравятся? • Понятный интерфейс • Отзывчивость в работе • Плавные переходы, анимация
  • 5. Сначала обычно всё хорошо Молодцы Спасибо вам большое Отличная, нужная программа! Отлично Приложение очень полезное! Супер, отличная программа! Красавы Отличное приложение
  • 6. Наращиваем функциональность… После последнего обновления стал тормозить. Каталоги не загружаются Испортили после обновления Перестала грузиться. Очень долго думает... Жалею, что обновил Старая версия была удобнее, похоже, сделали обновление ради обновления. Придётся искать предыдущие версии Тормоза!!! Бог ты мой, да отключите вы это позиционирование, дистанцию до магазина в метрах все и так знают. У меня телефон, а не сервер Пентагона. Мамо мия.
  • 7. И еще наращиваем… С каждым обновлением приложение грузится всё дольше и дольше. А теперь стало вылетать каждые 5 мин. Обидно. Отвратительное приложение. Не загружается нормально Фото не загружаются!!! Верните как было! Приложение тормозит по-страшному!!! Зря потратил время Господи, как же оно тормозит! Даже желание пропало знакомиться с предложенными возможностями! Тормозит Приложение раньше летало, пользуюсь больше года! Сейчас постоянно висит и вылетает. Удалила
  • 9. Как мы «разгоняли» Едадил Видео девайса с процессом загрузки? Проблемы: • загрузка данных стала занимать вечность • приложение стало слишком медлительным Что делать: • уменьшить время загрузки • уменьшить лаги интерфейса
  • 11. Устройства наших пользователей 73% Android Топ устройств Galaxy S3 Neo 2,87% Galaxy Grand Prime 2,56% Galaxy A3 2,12% Galaxy S4 Mini 1,91% Galaxy A5 1,85% Galaxy S4 1,60% Galaxy S3 1,56% Galaxy J1 1,30% Galaxy S5 1,23% Galaxy A5(2016) 1,19% Топ версий Android >= 5.0 57% 4.4.x 26% < 4.4 17%
  • 12. Структура API Едадила 1. получаем список id каталогов и магазинов поблизости edapi.net/locationInfo?lat=55.75&lng=37.62 2. получаем список акций (содержимое каталогов) edapi.net/catalogs?ids=121,122,123
  • 13. Процесс загрузки данных Время locationInfo catalog 1 catalog 2 catalog 3 catalog n Update UI… locationInfo catalog 2 catalog 1 catalog 3 catalog n Update UI Update UI …  
  • 14. Оптимизация по этапам загрузки Ожидание ответа сервера Десериализация Обработка данных • Оптимизация бэкенда • Кэширование на бэкенде • Кэширование на клиенте • Более быстрый формат данных (Protobuf) • Оптимизация кода
  • 15. fun loadLocationInfo(loc: Location) { api.getLocationInfo(lat, lon) .subscribeOn(Schedulers.newThread()) .subscribe { updateLocationInfo(it) notifyUI() loadCatalogs(it.catalogsIds) } } Загрузка списка id каталогов поблизости
  • 16. fun loadLocationInfo(loc: Location) { api.getLocationInfo(round(lat, 2), round(lon, 2)) .subscribeOn(Schedulers.newThread()) .subscribe { updateLocationInfo(it) notifyUI() loadCatalogs(it.catalogsIds) } } Загрузка списка id каталогов поблизости
  • 17. fun loadCatalogs(ids: List<Int>) { val observables = ids.map { api.getCatalogs(it) } Single.zip(observables, { it }).subscribeOn(Schedulers.newThread()) .subscribe { updateCatalogs(it) notifyUI() } } Содержимое каталогов
  • 18. Schedulers.newThread() fun loadCatalogs(ids: List<Int>) { val observables = ids.map { api.getCatalogs(it).subscribeOn(Schedulers.newThread()) } Single.zip(observables, { it }) .subscribe { updateCatalogs(it) notifyUI() } }
  • 19. Schedulers.io() fun loadCatalogs(ids: List<Int>) { val observables = ids.map { api.getCatalogs(it).subscribeOn(Schedulers.io()) } Single.zip(observables, { it }) .subscribe { updateCatalogs(it) notifyUI() } }
  • 20. Какой scheduler выбрать? • Schedulers.newThread() • Schedulers.io() • Schedulers.from(Executors.newFixedThreadPool(5)) • Schedulers.from( Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1) ) • Schedulers.from( Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2) )
  • 21. Schedulers.from(...) fun loadCatalogs(ids: List<Int>) { val observables = ids.map { api.getCatalogs(it).subscribeOn(scheduler) } Single.zip(observables, { it }) .subscribe { updateCatalogs(it) notifyUI() } }
  • 22. Форматы передачи данных • Текстовые форматы — XML, JSON + универсальные, с ним умеет работать всё; подходят для многих применений – сериализация-десериализация не самые быстрые • Бинарные вариации на тему JSON —BJSON, MessagePack + компактнее, чем текстовые; быстрее десериализуются • Protocol buffers – есть ограничения по типам данных
  • 23. Почему мы выбрали Protobuf • быстрая десериализация • человекочитаемость нам не нужна • лучше «обфусцированность», чем у MessagePack Сравнение форматов сериализации https://github.com/eishay/jvm-serializers/wiki • гарантия обратной совместимости * А потом мы узнали про FlatBuffers
  • 24. Бенчмарки Samsung Galaxy S4 (2 cpus), 3G интернет, ~100 каталогов, минимальная обработка данных, сервер отдает кэш 18 12 11 10 13 6 5 5 Последовательно Параллельно Schedulers.newThread() Параллельно Schedulers.io() Параллельно newFixedThreadPool JSON (gson) Protobuf (Wire)
  • 25. Что, если объединить запросы? edapi.net/catalogs?ids=121,122,123 10 8 9 5 4 6 1 каталог 10 каталогов Все каталоги JSON (gson) Protobuf (Wire)
  • 26. HTTP/2  OkHttp на Android 5.0+
  • 27. Пишем полученное на локальную ФС Время   catalog 1 catalog 2 catalog 3 catalog 4 catalog 5 catalog1.json catalog2.json catalog3.json catalog4.json catalog5.jsoncatalog 1 catalog 2 catalog 3 catalog 4 catalogs.protobuf
  • 28. Как хранить полученное на устройстве • Файлы с исходными данными + просто; один алгоритм обработки для локальных и удаленных данных – только для малого объема; нужно подготавливать данные при каждом запуске • Файлы с предварительно обработанными данными + обрабатываем один раз, потом просто используем – всё равно приходится считывать в память весь объем данных • Решения, специфичные для платформы (e.g. Core Data) + оперируем готовыми объектами; скорость работы на чтение – не все гладко с производительностью при записи; в целом — pain in the ass
  • 29. Как хранить полученное на устройстве • SQLite + структурированное хранилище; + гибкий язык запросов; + не держим всё в памяти, достаём данные порциями по надобности; + предварительную обработку (сортировку, группировку, фильтрацию) осуществляет СУБД; + нативная реализация для большинства платформ; – не всегда удобно работать с объектами — по-хорошему, не помешает ORM.
  • 30. Как хранить полученное на устройстве • NoSQL-базы и вариации на тему + как правило, быстрее, чем SQLite; + документоориентированная структура придает гибкости; + часто идут в комплекте с ORM; + можно передавать на вход JSON, который сразу ложится в базу; + есть решения с синхронизацией данных; – бывают проблемы с многопоточностью; – встречаются подводные камни, специфичные для реализации.
  • 31. Эволюция хранилища Едадила на iOS SQLite + FMDB • структура БД аналогична таковой на сервере; • самописное подобие ORM; • стабильно и предсказуемо, но все обертки приходится писать самому. Core Data + MagicalRecord • работать с сущностями стало удобнее; • производительность при записи больших объемов проседает; • в целом весьма капризное поведение. Realm • курсоры, уведомления; • очень простые миграции; • производительность радует;
  • 32. Оптимизация кода - updateCatalogs class Item { val id = 1234 val categoryId = 12 val retailerId = 3 val dateEnd = "2016-12-31T01:00:00", ... } TimeUtils.compareDates(now, TimeUtils.strToCalendar(item.dateEnd)) >= 0 nowStr.compareTo(item.dateEnd.take(10)) >= 0
  • 33. Оптимизация кода - updateCatalogs class Item { val id = 1234 val categoryId = 12 val retailerId = 3 val dateEnd = "2016-12-31T01:00:00", ... } class MyItem { val id = 1234 val category: Category val retailer: Retailer val dateEnd = "2016-12-31T01:00:00", ... } class ItemData { val category: Category val retailer: Retailer ... } model.getItemData(item).category ?
  • 34. Оптимизация кода — логи android.util.Log.d("tag", "something " + arg)
  • 35. Оптимизация кода — логи Utils.log("tag", "something " + arg) fun log(message: String) { if (BuildConfig.DEBUG) { android.util.Log.d("tag", message) } }
  • 36. Оптимизация кода — логи Utils.log("tag", "something %s", arg) fun log(message: String, vararg args: Any?) { if (BuildConfig.DEBUG) { android.util.Log.d("tag", message.format(*args)) } }
  • 37. Выводы • Думайте о будущем приложения с самого начала Выпустить сначала простейшую версию — это правильно. Но если полетело, то лучше не затягивать с переработкой потенциально слабых мест. • Если все же затянули с доработками Обязательно запланируйте отдельный технический релиз (или серию). Пользователи не всегда жаждут новые фичи, а вот ожившее приложение точно оценят. • Учитесь на чужих ошибках
  • 39. Какие ещё бывают проблемные места • Длинные списки — таблицы, коллекции • Формирование данных для списка • Конструкция ячейки • Работа с графикой • Асинхронная загрузка изображений • Используем кэш на устройстве • Целевая подготовка изображений • Аналитика • Разумное количество событий, их параметров и логики
  • 40. Решения по загружаемым данным • Структурирование передаваемых через API данных • Не стремимся повторить структуру серверного хранилища • Не проецируем структуру данных на интерфейс (и наоборот) • Количество запросов • Зависимость одних запросов от результата выполнения других • Объем передаваемых данных • Приложение-терминал или приложение-СУБД? • Работа в оффлайне • Для мобильных приложений — отдельный API
  • 41. Что используют в Android • http-клиент (OkHttp + Retrofit) • JSON (GSON, Jackson, Moshi) • Protocol Buffers (Wire) • Другие форматы и библиотеки (MessagePack, BJSON) • Изображения (Picasso, GLide, UIL, Fresco) • RxJava

Editor's Notes

  1. Как оказалось, структура не идеальна: - плохо кэшируется - избыточные данные
  2. 15
  3. 16
  4. Schedulers.newThread() - число потоков неограниченоSchedulers.io() - число потоков неограниченоSchedulers.computation()Schedulers.from(Executors.newFixedThreadPool(5))Schedulers.from(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1))Schedulers.from(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2))
  5. 26
  6. 32
  7. 33
  8. Плохо: в релизной сборке не должно быть логов
  9. Плохо: в релизной сборке итоговое сообщение вычисляется