【问题标题】:Periodically import data from files on Heroku定期从 Heroku 上的文件导入数据
【发布时间】:2026-01-07 00:25:01
【问题描述】:

我需要定期将一些数据导入 Heroku 上的 rails 应用程序。

要执行的任务分为以下几个部分: * 从网站下载一个大的 zip 文件(例如~100mb) * 解压文件(解压后的空间约为 1.50gb) * 运行一个 rake 脚本来读取这些文件并使用我的活动记录模型创建或更新记录 * 清理

如何在 heroku 上做到这一点?使用一些外部存储(例如 S3)是否更好。 你会如何处理这样的事情?

理想情况下,这需要每晚运行一次。

【问题讨论】:

    标签: import cron heroku


    【解决方案1】:

    几天前我尝试过完全相同的事情,但我得出的结论是,由于 heroku 对每个进程施加的内存限制限制,这无法完成。 (我用从互联网上读取的文件构建了一个数据结构并尝试推送到数据库)

    我正在使用一个 rake 任务,它会提取和解析几个大文件,然后填充数据库。

    作为一种解决方法,我现在在我的本地机器上运行这个 rake 任务并将数据库推送到 S3 并从我的本地机器发出一个 heroku 命令来恢复 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 任务,可以自动执行所有这些步骤。

    之后你可能会尝试使用 worker(DelayedJob)。我想您可以将您的工作人员配置为每 24 小时运行一次。我认为工人没有 30 秒的限制。但我不确定内存使用情况。

    【讨论】: