Skip to content

Solution#2

Open
Aleksgav wants to merge 1 commit intospajic:masterfrom
Aleksgav:master
Open

Solution#2
Aleksgav wants to merge 1 commit intospajic:masterfrom
Aleksgav:master

Conversation

@Aleksgav
Copy link

@Aleksgav Aleksgav commented May 7, 2019

Как интересно - метаинформация о данных - ровно почти то же что я понял о данных из предыдущего задания

Основной код встаки здесь

Для загрузки - все запускается так же: bin/setup
По умолчанию грузится фаил small.json
Для загрузки другого файла: bin/setup 1M.json

Для начала я просто попытался загрузить фаил 1M используя решение из задания 4
Он загрузился
Общее время: 56.74s
Загрузка JSON: 14.237619999796152
Парсинг JSON: 5.96524399984628
Импорт JSON: 65.6413819999434

Для интереса проделал то же самое с вторым вариантом решения задания 4
Загрузка JSON: 13.79
Парсинг и импорт данных: 76.85

Буду отталкиваться от первого варианта с полной загрузкой батчами.
Буду двигаться в направлении указанном в ридми - чтение понемного и вставка потоком.
Попробовал на большом файле просто прочитать его в память и потерпел фиаско.

Сразу решил внедрить прогрессбар, хоть он и замедляет работу.
Буду получать размер файла в байтах, размер каждого символа в байтах и строить прогресс.

Запустил просто посимвольное чтение с прогрессбаром.
Ожидаемое время окочания чтения - более 2х часов
Это очень долго

Попробовал читать фаил побайтово, частями по 32МБ
Весь фаил читался быстро - большой за 5s
Но возникали проблемы с парсингом (нужно учитывать частичное чтение), проблемы с кодировкой и тд

Другой путь использовать стриминговый парсинг JSON

Решил попробовать стриминговый парсинг.
Библиотеку Oj уже использовал, и она самая быстрая, позволяет делать стриминговый парсинг JSON.

Простое чтение с парсингом JSON файла 10M занимает - 23s
При оптимизации памяти буду стремиться к размеру ~100M

Так же понял свой недочет в 4м задании - можно сделать импорт проще.

Тк у нас, при импорте каждый раз обнуляется БД - то можно не получать id импортируемых данных, а генерировать их самостоятельно.
Это упростит код.

Выяснилось что возможны дубли по номерам автобусов (это не очень ясно из задания),
поэтому изменил уникальный ключ на [номер автобуса, модель автобуса]

После всех оптимизаций:
10M
Время загрузки: 200.40s
Потребление по памяти: 118Mb

1M
Время загрузки: 23.89s
Потребление по памяти: 115Mb

Copy link
Owner

@spajic spajic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants