首页 > 解决方案 > 使用 Rails 数据创建大型 ZIP 文件并将其发送到 Amazon S3 存储的最佳方法是什么?

问题描述

我在 Ruby on Rails 应用程序中有一个功能,可以备份用户的所有帐户数据,以便他们可以将其下载到 ZIP 文件中并将其存储在本地。

要创建 ZIP 文件,我正在执行以下操作:

  1. 使用 ZIP::OutputStream 打开 ZIP 文件流。

  2. 浏览用户帐户中的每个相关模型,将该模型中的所有记录转换为 CSV,然后将每个 CSV 添加到 ZIP 文件中。

  3. 将生成的 ZIP 文件发送到 AWS S3。

下面是一些伪代码来说明这个过程:

output_stream = Zip::OutputStream.write_buffer do |zos| 

    @models_to_backup.each do |model|
       csv = model.convert_to_csv_file
       zos.put_next_entry("csv_files/#{model.name}.csv")
       zos.write csv
    end

end

output_stream.rewind
SendFileToS3(output_stream)

这适用于较小的文件,但大多数用户拥有超过 100,000 条记录。因此,随着 ZIP::OutputStream 的生成,我很快遇到了内存问题(我将应用程序托管在 Heroku 上),因为输出流在发送之前都存储在内存中。

有没有更节省内存的方法来创建这些 ZIP 文件?有没有办法在创建时将 ZIP 分批流式传输到 S3,以避免在内存中创建整个 ZIP 文件?或者,我是否只需要提供更高内存限制的服务器来完成此操作?

标签: ruby-on-railsherokuamazon-s3

解决方案


回答我自己的问题,以防将来有人看到。在研究了几天后,我找不到一个很好的解决方案。

我有点笨拙的解决方法是在我运行备份时暂时使用 Heroku Performance-L dyno(它有 14GB 内存)(每月只需要发生一次。)可能不是最优雅的解决方案,但它可以工作。


推荐阅读