Conversation
| if nesting == 0 # если закончился объкет уровня trip, парсим и импортируем его | ||
| trip = FastJsonparser.parse(str) | ||
|
|
||
| copy( |
There was a problem hiding this comment.
тут, конечно, забивается на валидации всех моделей совершенно.
идея по этому поводу была такая – использовать по одному инстансу модели на каждую и валидировать их перед копи/записью в справочники через валидации, которые не лезут в базу. на те, которые лезут в базу, вроде uniqueness, сделать уникальный индекс, потом делать reset шаблона.
тут есть момент по реализации, что делать с валидным родительским элементом, но невалидные дочерним (или наоборот).
второй вариант: переносить все валидации на констрейнты и индексы в базу
There was a problem hiding this comment.
справедливо; у меня кстати по поводу валидаций в моделях и констрейнтов в pg как-то не сложилось однозначного мнения
в целом валидации в модели имеют место быть - на мой взгляд, ответственность модели - это быть валидным кирпичиком предметной области;
но с другой стороны если валидации будут в базе - у модели тоже не получится быть невалидной
но с третьей стороны в моделях как-то попроще и нет очень много завязок на БД
короче путь компромиссов
82002a5 to
a899f61
Compare
| В результате проделанной оптимизации наконец удалось обработать файл с данными. | ||
| Удалось улучшить метрику системы с с 77 секунд до 1.4с для medium и уложиться в заданный бюджет. | ||
| Файл large грузится за 6.5 секунд | ||
| Файл 1м стал грузится за 56 секунд. |
There was a problem hiding this comment.
тут хочется понять, как обработать файл на 10м до минуты (нужны наводки, сейчас грузит чуть меньше 10 минут). из идей пока только использовать sax parser вроде ::Oj::Saj.
There was a problem hiding this comment.
а я что-то потерял контекст; где-то было что за 1 минуту можно? (я просто не помню)
можно попрофилировать, посмотреть ;)
навскидку, возможно там парсинг не нужен, можно просто по кусочкам разбирать на поля
There was a problem hiding this comment.
@spajic в ридми написано, что large должен до минуты проходить, я подумал, что для остальных такая же метрика, с учетом дальнейших оптимизаций))
| @@ -1 +1 @@ | |||
| 2.6.3 | |||
| 2.6.10 | |||
There was a problem hiding this comment.
ого, вот это им попатчить пришлось ))
| gem 'pg', '>= 0.18', '< 2.0' | ||
| gem 'puma', '~> 3.11' | ||
| gem 'bootsnap', '>= 1.1.0', require: false | ||
| gem 'fast_jsonparser' |
There was a problem hiding this comment.
возможно прикольно было бы к рельсам по дефолту его прикрутить; или сделать возможность настройки
типа чтобы где-то в кишках Rails.cache.read не терялось время на парсинг строки не самым эффективным
|
|
||
| def initialize | ||
| @cities = {} | ||
| @buses = Hash.new { |h, k| h[k] = {} } |
There was a problem hiding this comment.
классная штука с автоматической инициализацией
| if nesting == 0 # если закончился объкет уровня trip, парсим и импортируем его | ||
| trip = FastJsonparser.parse(str) | ||
|
|
||
| copy( |
There was a problem hiding this comment.
справедливо; у меня кстати по поводу валидаций в моделях и констрейнтов в pg как-то не сложилось однозначного мнения
в целом валидации в модели имеют место быть - на мой взгляд, ответственность модели - это быть валидным кирпичиком предметной области;
но с другой стороны если валидации будут в базе - у модели тоже не получится быть невалидной
но с третьей стороны в моделях как-то попроще и нет очень много завязок на БД
короче путь компромиссов
| copy trips (from_id, to_id, start_time, duration_minutes, price_cents, bus_id) from stdin with csv delimiter ';' | ||
| SQL | ||
|
|
||
| ActiveRecord::Base.connection.raw_connection.copy_data(sql) do |
There was a problem hiding this comment.
кайф, лайк за стриминг, очень мало кто это делает в этом задании
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время загрузки medium файла (10к записей, 77 секунд в первой итерации) | ||
|
|
||
| ## Гарантия корректности работы оптимизированной программы | ||
| Программа не поставлялась с тестом, поэтому перед выполнением оптимизации я добавил его самостоятельно: загрузка example файла с дальнейшим сравнением загруженных в бд данных с эталоном. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. |
| В результате проделанной оптимизации наконец удалось обработать файл с данными. | ||
| Удалось улучшить метрику системы с с 77 секунд до 1.4с для medium и уложиться в заданный бюджет. | ||
| Файл large грузится за 6.5 секунд | ||
| Файл 1м стал грузится за 56 секунд. |
There was a problem hiding this comment.
а я что-то потерял контекст; где-то было что за 1 минуту можно? (я просто не помню)
можно попрофилировать, посмотреть ;)
навскидку, возможно там парсинг не нужен, можно просто по кусочкам разбирать на поля
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время загрузки страницы `автобусы/Самара/Москва` при наличии 100к поездок в базе данных. Начальное измерение – 13.3с. | ||
|
|
||
| ## Гарантия корректности работы оптимизированной программы | ||
| Программа не поставлялась с тестом, поэтому перед выполнением оптимизации я добавил его самостоятельно: результат работы страницы `автобусы/Самара/Москва` для данных из файла `fixtures/example.json` сравнивается с тем, который был сформирован до изменений. |
|
|
||
| ## Результаты | ||
| В результате проделанной оптимизации наконец удалось обработать файл с данными. | ||
| Удалось улучшить метрику системы с 13.3с до 0.6с. |
| get(:index, params: {from: 'Самара', to: 'Москва'}) | ||
|
|
||
| assert_response(:success) | ||
| assert_equal(@response.body.squish, File.read('test/fixtures/files/example_index.html').squish) |
No description provided.