ruby-on-rails - 使用 Rails 数据创建大型 ZIP 文件并将其发送到 Amazon S3 存储的最佳方法是什么?
问题描述
我在 Ruby on Rails 应用程序中有一个功能,可以备份用户的所有帐户数据,以便他们可以将其下载到 ZIP 文件中并将其存储在本地。
要创建 ZIP 文件,我正在执行以下操作:
使用 ZIP::OutputStream 打开 ZIP 文件流。
浏览用户帐户中的每个相关模型,将该模型中的所有记录转换为 CSV,然后将每个 CSV 添加到 ZIP 文件中。
将生成的 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 文件?或者,我是否只需要提供更高内存限制的服务器来完成此操作?
解决方案
回答我自己的问题,以防将来有人看到。在研究了几天后,我找不到一个很好的解决方案。
我有点笨拙的解决方法是在我运行备份时暂时使用 Heroku Performance-L dyno(它有 14GB 内存)(每月只需要发生一次。)可能不是最优雅的解决方案,但它可以工作。
推荐阅读
- c# - 单元测试 Mathf.Sine C# / Unity
- excel - Excel VBA - 为什么我收到运行时错误
- r - 在 dplyr 中跨多个(> 2)列随机化顺序
- report - 报告查看器 - RDLC - 以对角线显示文本
- sql - 如何在 Dremio 中创建临时表
- javascript - 单击按钮后Javascript数组实时更改
- node.js - 我已经在我的 Windows 7(64 位)计算机中安装了 socket.io。我收到“No valid export main found for socket.io”的错误。有什么修复吗?
- javascript - 为什么我不能在 React 的 BrowserRouter 中使用 useLocation?
- c# - 当前上下文中不存在名称“fileName”-BIML
- c# - 向自定义用户控件 WPF 添加附加内容