Skip to content

import huge files#1

Open
paderinandrey wants to merge 2 commits intospajic:masterfrom
paderinandrey:import-huge-files
Open

import huge files#1
paderinandrey wants to merge 2 commits intospajic:masterfrom
paderinandrey:import-huge-files

Conversation

@paderinandrey
Copy link

@paderinandrey paderinandrey commented Apr 25, 2019

Не стал пушить весь проект, ибо лишних файлово чень много, пушу только то, что изменил по сравнению с 4м заданием

  • Увидел через pghero неиспользуемые индексы, удалил их.
  • Перед загрузкой trips отключаю индексы
      UPDATE pg_index
      SET indisready=false
      WHERE indrelid = (
        SELECT oid
        FROM pg_class
        WHERE relname='trips'
      );
  • После загрузки включил индексы и запускаю реиндексацию trips.
      UPDATE pg_index
      SET indisready=true
      WHERE indrelid = (
        SELECT oid
        FROM pg_class
        WHERE relname='trips'
      );

    REINDEX TABLE trips;

Такую же операцию сделал и для таблицы buses.

  • memory profiler показал, что в топе прожорливых операций посимвольное чтение ff.read(1) заменил чтение на each_char удалось сократить с 130 МБ до 95 МБ
  • Переделал чтение на стриминг Json::Streamer.parser, использовал кастомный генеатор Yajl::FFI::Parser.new, тот что из коробки JSON::Stream в разы медленнее.
  • В итоге удалось сократить объем памяти с 95 МБ до 18 МБ
  • Реализовал импорт через pipelines

В итоге удалось загрузить файл за 150 сек.

Warming up --------------------------------------
               small     1.000  i/100ms
              medium     1.000  i/100ms
               large     1.000  i/100ms
                  1M     1.000  i/100ms
Calculating -------------------------------------
               small      2.390  (±41.8%) i/s -      9.000  in   5.170120s
              medium      0.499  (± 0.0%) i/s -      3.000  in   6.012589s
               large      0.062  (± 0.0%) i/s -      1.000  in  16.136268s
                  1M      0.005  (± 0.0%) i/s -      1.000  in 150.838063s

На файле 10М Yajl::FFI::Parser.new уже начинает не справляться. Попробую переделать импорт с использованием Oj.sc_parse

UPD
Переделал с использованием Oj.sc_parse в итоге файл 1М загрузился за 30 сек, файл 10М примерное за 5 минут.

1M       0.030  (± 0.0%) i/s -      1.000  in  32.943601s
10M      0.003  (± 0.0%) i/s -      1.000  in 316.797466s

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.

Respect!

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