Conversation
| # frozen_string_literal: true | ||
|
|
||
| module Tasks | ||
| class ImportJsonData |
| str = +'' | ||
|
|
||
| until ff.eof? | ||
| ch = ff.read(1) # читаем по одному символу |
There was a problem hiding this comment.
👍 лайк за стриминг, мало кто делает
| <% end %> | ||
| </ul> | ||
|
|
||
| ==================================================== |
There was a problem hiding this comment.
Вот этот разделитель можно тоже параметром задать (забавный факт: https://guides.rubyonrails.org/layouts_and_rendering.html#spacer-templates)
| </h1> | ||
| <h2> | ||
| <%= "В расписании #{@trips.count} рейсов" %> | ||
| <%= "В расписании #{@trips.length} рейсов" %> |
| Нужно применить подход с BATCH INSERT. Для этого использовался гем **activerecord-import**. Основная проблема была импортировать связи, т.к | ||
| требуется внешний ключ, т.е знание id непосредственно на уровне бд. Чтобы не делать лишних SELECT запросов, использовал хранение id автобусов, городов и сервисов в хеше на уровне оперативной памяти (хеш обновлялся каждый раз при добавлении новых объектов в базу) | ||
|
|
||
| Также добавлял индексы (в том числе и составные) на уникальность, т.к при BATCH INSERT возможно появления дубликатов и нужна валидация на уровне бд |
There was a problem hiding this comment.
кстати говоря, индексы лучше в таком случае накидывать после импорта
может иметь смысл даже такой флоу
- удалили индекс
- импортнули данные
- создали индекс (если не создался - увы, что-то не так пошло с импортом)
зависит от использования конечно; но поинт в том, что вставки в базе идут быстрее когда не приходится индекс обновлять / проверять / поддерживать
| - видна долгая загрузка partial _trip.html.erb и _service.html.erb | ||
| - удалил конструкцию с `@trips.each` и переписал на более быстрый подход рендера с конструкцией `render partial: "trip", collection: @trips` | ||
| - аналогично для сервисов: `<%= render partial: "service", collection: trip.bus.services %>` | ||
| - рендер страницы ускорился с 2.7 секунд до 500мс |
| ### Находка №4 | ||
| - Рендер вьюх всё ещё занимал основное время | ||
| - Дропнул ненужную вьюху `_delimiter.html.erb` и просто вставил текст из неё в родительскую вьюху `_trip.html.erb` | ||
| - рендер страницы ускорился с 500мс до 260мс |
|
|
||
| ``` | ||
|
|
||
| -> получилось добиться открытия страницы за 263мс |
There was a problem hiding this comment.
там ещё индексы на таблицы можно создать было бы; с точки зрения времени загрузки это не топ проблема, но с точки зрения нагрузки на базу - да; и это идёт как use-case pg-hero, так как он прям пишет какие индексы надо создать
No description provided.