Я использую ActiveRecord для массовой миграции некоторых данных из таблицы в одной базе данных в другую таблицу в другой базе данных. Около 4 миллионов строк.
Я использую find_each для получения пакетов. Затем я делаю небольшую логику для каждой выбранной записи и записываю ее в другую базу данных. Я пробовал как писать напрямую по одному, так и использовать красивый активный камень записи-записи для пакетной записи.
Тем не менее, в случае или мое использование памяти процессом ruby довольно сильно возрастает на протяжении всего периода экспорта / импорта. Я бы подумал, что с помощью find_each я получаю партии по 1000 штук, их должно быть только 1000 в памяти за раз ... но нет, каждая извлекаемая запись, кажется, потребляет память вечно, пока процесс не закончится.
Есть идеи? Кэширует ли ActiveRecord что-то, что я могу отключить?
обновление 17 января 2012
Я думаю, что собираюсь отказаться от этого. Я пытался:
* Убедитесь, что все обернуто в ActiveRecord::Base.uncached do
* Добавление ActiveRecord::IdentityMap.enabled = false
(я думаю , что должно отключить карту идентификации для текущего потока, хотя это не ясно задокументировано, и я думаю карта идентификации не включена по умолчанию в любом случае в Rails)
Кажется, что ни один из них не имеет большого эффекта, память все еще протекает.
Затем я добавил периодическое явное:
Это, кажется, замедляет скорость утечки памяти, но утечка памяти все еще происходит (в конечном итоге исчерпывает всю память и бомбардировки).
Так что я думаю, что я сдаюсь, и решил, что в настоящее время невозможно использовать AR для чтения миллионов строк из одного БД и вставки их в другой. Возможно, имеется утечка памяти в используемом специфическом для MySQL коде (это мой db), или где-то еще в AR, или кто знает.