我需要定期将一些数据导入到Heroku的rails应用程序中。
要执行的任务分为以下几部分: *从网站下载一个大的zip文件(例如~100mb) *解压缩文件(解压缩空间约为1.50gb) *运行一个rake脚本,该脚本读取这些文件并使用我的活动记录模型创建或更新记录 *清理
我如何在heroku上执行此操作?是否更好地使用一些外部存储(例如S3)。 你会怎么做这样的事情?
理想情况下,这需要每晚运行。
答案 0 :(得分:1)
我几天前已经尝试了完全相同的事情,而我得出的结论是因为heroku对每个进程施加的内存限制限制而无法完成。 (我使用从互联网上读取的文件构建数据结构并尝试推送到数据库)
我正在使用rake任务来拉取和解析几个大文件,然后填充数据库。
作为解决方法,我现在在本地计算机上运行此rake任务,并将数据库推送到S3并从本地计算机发出heroku命令以恢复heroku数据库实例。
"heroku pgbackups:restore 'http://s3.amazonaws.com/#{yourfilepath}' --app #{APP_NAME} --confirm #{APP_NAME}"
您可以使用雾库
推送到S3require '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任务。
事后你可能会尝试使用worker(DelayedJob)。我想你可以配置你的工人每24小时运行一次。我认为工人没有限制30秒的限制。但我不确定内存使用情况。