Миграция Ruby on Rails очень медленная - PullRequest
1 голос
/ 25 декабря 2009

У меня есть база данных SQLite3, которая заполнена большим набором данных. Для этого я использую миграцию.

3 таблицы будут иметь следующее количество записей: Таблица_1 будет иметь около 10 записей каждая запись таблицы_1 будет связана с ~ 100 записями в таблице_2 каждая запись таблицы_2 будет связана с ~ 2000 записями в таблице_3

Количество записей будет около 10 * 100 * 2000 = 2000000

Это занимает много времени ... Событие, если я заполняю свою базу данных примерно 20000 записями, это занимает около 10 минут.

Кроме того, я заметил, что при выполнении миграции интерпретатор ruby ​​отнимает всего 5% времени ЦП, а 95% остается неиспользованным ...

В чем причина такой чистой производительности?

Ответы [ 3 ]

2 голосов
/ 25 декабря 2009

Проще говоря, вставка большого количества записей через ручное сохранение объектов AR по одному займет годы.

Лучший компромисс между скоростью и «чистотой» (т.е. не полным хитрым взломом) для вставки больших объемов данных - это метод импорта ar-extensions (http://github.com/zdennis/ar-extensions)). Он не идеален, но лучше, чем любой из альтернативы, которые я мог бы найти, и синтаксис чистый, и не требует, чтобы вы перешли на raw sql (или где-нибудь близко).

Пример синтаксиса:

items = Array.new
1.upto(200) do |n|
  items << Item.new :some_field => n
end
Item.import items, :validate => false

По крайней мере, в MySQL это объединит записи в один оператор INSERT с несколькими наборами значений. Довольно чертовски быстро.

1 голос
/ 25 декабря 2009

Если вы выполняете каждый оператор INSERT в своей собственной транзакции, SQLite может работать очень и очень медленно. Но если вы выполняете все это за одну транзакцию (или логический набор транзакций), тогда это может быть очень быстро.

0 голосов
/ 25 декабря 2009

Seed_fu может помочь, как обсуждалось в этом вопросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...