Обновление больших объемов данных в приложении Rails - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть приложение rails с таблицей из примерно 30 миллионов строк, которую я строю из текстового документа, который мой поставщик данных предоставляет мне ежеквартально.Оттуда я делаю некоторые манипуляции и сравнение с некоторыми другими таблицами и создаю дополнительную таблицу с более настраиваемыми данными.

В первый раз, когда я делал это, я запускал скрипт ruby ​​через консоль Rails.Это было медленно и, очевидно, не лучшим способом.

Каков наилучший способ упростить этот процесс и обновить его на моем производственном сервере без каких-либо или хотя бы очень ограниченных простоев?

Этопроцесс, который я считаю лучшим на данный момент:

  1. создание граблей для чтения данных.Используйте плагин activerecord-import, чтобы выполнить пакетную запись и отключить проверки activerecord.Загрузите эти данные в новые дублирующиеся таблицы.

  2. Создание индексов для вновь создаваемых таблиц.

  3. Переименование вновь созданных таблиц в имена, соответствующие рельсам.приложение ищет.

  4. Удалить старое.

Все это я планирую сделать прямо на рабочем сервере.

Есть ли лучший способ сделать это?

Другие примечания к комментариям:

  • Таблицы уже существуют
  • Старые таблицы и данные одноразовые
  • Таблицы могут быть заблокированы только для выбора
  • Необходимо свести к минимуму время простоя
  • В настоящее время у нас есть 2 экземпляра Amazon EC2 с высоким процессором.Я полагаю, что они имеют 1,7 ГБ ОЗУ, поэтому временное хранение всего импорта, вероятно, не вариант.
  • Новые данные - это необработанный текстовый файл с разделителями строк.У меня есть скрипт для разбора, он уже написан на Ruby.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

В зависимости от вашей логики, я бы серьезно подумал об обработке данных в базе данных с использованием SQL. Это близко к данным, и 30-метровые строки - это, как правило, не то, что вы хотите извлечь из базы данных и сравнить с другими данными, которые вы также извлекли из базы данных.

Так что думайте за рамками Ruby on Rails.

SQL имеет встроенную возможность объединения данных и сравнения данных, а также вставки и обновления таблиц, эти возможности могут быть очень мощными и быстрыми, позволяя обрабатывать данные вблизи данных.

1 голос
/ 14 февраля 2012

1) создайте «my_table_new» как пустой клон «my_table» 2) импортируйте файл (в пакетах по x строк) в my_new_table - индексы, создаваемые по ходу работы.3) Выполнить: RENAME TABLE my_table TO my_table_old, my_table_new TO my_table;

Выполнение этой команды одной командой делает ее мгновенной (достаточно близкой), поэтому практически без простоев.Я сделал это с большими наборами данных, и в качестве его переименования это «переключатель», вы должны сохранить время безотказной работы.

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