Периодически импортируйте данные из файлов на Heroku - PullRequest
1 голос
/ 02 июня 2011

Мне нужно периодически импортировать некоторые данные в мое приложение rails на Heroku.

Задача, которую нужно выполнить, разделена на следующие части: * загрузка большого zip-файла (например, ~ 100 МБ) с веб-сайта * распаковкафайл (размер разархивированного файла ~ 1,50 ГБ) * запустить скрипт rake, который читает этот файл и создает или обновляет записи, используя мои активные модели записей * cleanup

Как я могу это сделать на heroku?Лучше использовать какое-то внешнее хранилище (например, S3).Как бы вы подошли к такой вещи?

В идеале это должно выполняться каждую ночь.

1 Ответ

1 голос
/ 02 июня 2011

Я пытался сделать то же самое пару дней назад, и пришел к выводу, что это невозможно сделать из-за ограничений памяти, которые героку накладывает на каждый процесс. (Я строю структуру данных из файлов, которые я читаю из Интернета, и пытаюсь отправить их в БД)

Я использовал задачу rake, которая вытащила и проанализировала пару больших файлов, а затем заполнила базу данных.

В качестве обходного пути я теперь запускаю эту задачу rake на своем локальном компьютере, помещаю базу данных на S3 и запускаю команду heroku с моего локального компьютера, чтобы восстановить экземпляр DB heroku.

"heroku pgbackups:restore 'http://s3.amazonaws.com/#{yourfilepath}' --app  #{APP_NAME} --confirm #{APP_NAME}"

Вы можете нажать на S3, используя библиотеку тумана

require 'rubygems'
require 'fog'
connection = Fog::Storage.new(
    :provider              => 'AWS',
    :aws_secret_access_key => "#{YOUR_SECRECT}",
    :aws_access_key_id     => "#{YOUR_ACCESS_KEY}"
)

directory = connection.directories.get("#{YOUR_BACKUP_DIRECTORY}")

# upload the file
file = directory.files.create(
    :key    => '#{REMOTE_FILE_NAME}',
    :body   => File.open("#{LOCAL_BACKUP_FILE_PATH}"),
    :public => true
)

Команда, которую я использую для создания pgbackup на моей локальной машине:

system "PGPASSWORD=#{YOUR_DB_PASSWORD} pg_dump -Fc --no-acl --no-owner -h localhost -U #{YOUR_DB_USER_NAME} #{YOUR_DB_DATABSE_NAME} > #{LOCAL_BACKUP_FILE_PATH}"

Я поставил задачу rake, которая автоматизирует все эти шаги.

После всего, что вы можете попробовать - использовать работник (DelayedJob). Я полагаю, вы можете настроить своих рабочих на запуск каждые 24 часа. Я думаю, что у рабочих нет ограничения в 30 секунд. Но я не уверен насчет использования памяти.

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