使用Ruby将大文件上传到S3时出现内存不足错误,如何批量读取和上传?

轻拍

我们正在从Windows计算机通过Ruby AWS SDK(v2)将各种文件上传到S3。我们已经使用Ruby 1.9进行了测试。我们的代码运行正常,除非遇到大文件,抛出内存不足错误。

首先,我们使用以下代码将整个文件读入内存:

:body => IO.binread(filepath),

然后在Googling之后,我们发现有一些方法可以使用Ruby读取文件:

:body =>  File.open(filepath, 'rb') { |io| io.read },

但是,此代码无法解决问题,我们找不到特定的S3(或相关)示例,该示例显示了如何读取文件并将其分块传递给S3。整个文件仍被加载到内存中,大文件抛出内存不足错误。

我们知道我们可以将文件拆分为多个块,然后使用AWS分段上传将其上传到S3,但是,如果可能的话,首选避免这种情况(尽管这是唯一的方法,但可以)。

我们的代码示例如下。批量读取文件,避免内存不足错误并上传到S3的最佳方法是什么?

require 'aws-sdk'

filepath = 'c:\path\to\some\large\file.big'
bucket = 's3-bucket-name'
s3key = 'some/s3/key/file.big'
accesskeyid = 'ACCESSKEYID'
accesskey = 'ACCESSKEYHERE'
region = 'aws-region-here'

s3 = Aws::S3::Client.new(
  :access_key_id => accesskeyid,
  :secret_access_key => accesskey,
  :region => region
  )

resp = s3.put_object(
  :bucket => bucket,
  :key => s3key,
  :body =>  File.open(filepath, 'rb') { |io| io.read },
  )

请注意,我们没有达到S3 5GB的限制,例如1.5GB的文件就是这种情况。

特雷弗·罗

适用于Ruby(aws-sdkgem)的v2 AWS开发工具包支持直接通过网络流式传输对象,而无需将其加载到内存中。您的示例仅需进行较小的更改即可:

File.open(filepath, 'rb') do |file|
  resp = s3.put_object(
   :bucket => bucket,
   :key => s3key,
   :body => file
  )
end

之所以有效,是因为它允许SDK调用#read每次传递少量字节的文件对象。#read在没有第一个参数的情况下调用Ruby IO对象(例如文件)会将整个对象读入内存,并将其作为字符串返回。这就是导致您的内存不足错误的原因。

也就是说,aws-sdkgem提供了另一个更有用的界面,用于将文件上传到Amazon S3。此替代界面会自动:

  • 对大型对象使用多部分API
  • 可以使用多个线程并行上传零件,提高了上传速度
  • 计算数据客户端的MD5,以进行服务端数据完整性检查。

一个简单的例子:

# notice this uses Resource, not Client
s3 = Aws::S3::Resource.new(
  :access_key_id => accesskeyid,
  :secret_access_key => accesskey,
  :region => region
)

s3.bucket(bucket).object(s3key).upload_file(filepath)

这是aws-sdk资源接口的一部分这里有很多有用的实用程序。Client类仅提供基本的API功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用块上传时,大于3Mb的文件出现内存不足错误

来自分类Dev

使用 Ruby 将文件上传到 S3 时出现 Aws::Errors::MissingRegionError

来自分类Dev

将文件从 AWS lambda 上传到 S3 时出现 MD-5 校验和错误

来自分类Dev

将5G文件上传到Amazon S3时出现EntityTooLarge错误

来自分类Dev

使用 boto3 和 python flask 将 CSV 文件上传到 S3 存储桶时出现错误 500

来自分类Dev

如何读取大文件并将其上传到s3?

来自分类Dev

保存大文件时出现内存不足错误

来自分类Dev

使用PIL修改文件后,如何从文件上传表单将文件上传到s3?

来自分类Dev

尽管有缓冲,但从Android应用程序上传大文件仍会出现内存不足错误

来自分类Dev

尽管有缓冲,但从Android应用程序上传大文件仍会出现内存不足错误

来自分类Dev

尝试使用 boto3 将 numpy 数组上传到 s3 时出现 Pyspark 酸洗错误

来自分类Dev

将CSV文件上传到s3时出现问题

来自分类Dev

在大文件上传中批量处理数据时,如何避免PHP / WordPress内存致命错误?

来自分类Dev

当文件在本地存储中时,如何使用boto3将文件上传到s3

来自分类Dev

尝试使用boto3将文件上传到S3时找不到文件

来自分类Dev

如何自动将文件上传到s3

来自分类Dev

使用NodeJS将文件上传到Amazon S3

来自分类Dev

使用flask将文件上传到亚马逊s3

来自分类Dev

使用flask将文件上传到亚马逊s3

来自分类Dev

无法使用JavaScript将文件上传到S3

来自分类Dev

使用NodeJS和S3FS / multiparty将文件上传到Amazon S3

来自分类Dev

将本地文件上传到amazon aws s3时如何获取本地文件?

来自分类Dev

akka.http.scaladsl.model.ParsingException:使用akka http将大文件上传到S3时,多部分实体意外结束

来自分类Dev

使用Ruby SDK将文件上传到Amazon S3

来自分类Dev

将大文件夹上传到Amazon S3

来自分类Dev

将大文件夹上传到Amazon S3

来自分类Dev

使用Ajax和Boto3 for Django将文件上传到S3

来自分类Dev

如何使用Node将图像上传到S3

来自分类Dev

使用 rails、carrierwave-direct 和 jquery 文件上传将文件上传到客户端的 s3

Related 相关文章

  1. 1

    使用块上传时,大于3Mb的文件出现内存不足错误

  2. 2

    使用 Ruby 将文件上传到 S3 时出现 Aws::Errors::MissingRegionError

  3. 3

    将文件从 AWS lambda 上传到 S3 时出现 MD-5 校验和错误

  4. 4

    将5G文件上传到Amazon S3时出现EntityTooLarge错误

  5. 5

    使用 boto3 和 python flask 将 CSV 文件上传到 S3 存储桶时出现错误 500

  6. 6

    如何读取大文件并将其上传到s3?

  7. 7

    保存大文件时出现内存不足错误

  8. 8

    使用PIL修改文件后,如何从文件上传表单将文件上传到s3?

  9. 9

    尽管有缓冲,但从Android应用程序上传大文件仍会出现内存不足错误

  10. 10

    尽管有缓冲,但从Android应用程序上传大文件仍会出现内存不足错误

  11. 11

    尝试使用 boto3 将 numpy 数组上传到 s3 时出现 Pyspark 酸洗错误

  12. 12

    将CSV文件上传到s3时出现问题

  13. 13

    在大文件上传中批量处理数据时,如何避免PHP / WordPress内存致命错误?

  14. 14

    当文件在本地存储中时,如何使用boto3将文件上传到s3

  15. 15

    尝试使用boto3将文件上传到S3时找不到文件

  16. 16

    如何自动将文件上传到s3

  17. 17

    使用NodeJS将文件上传到Amazon S3

  18. 18

    使用flask将文件上传到亚马逊s3

  19. 19

    使用flask将文件上传到亚马逊s3

  20. 20

    无法使用JavaScript将文件上传到S3

  21. 21

    使用NodeJS和S3FS / multiparty将文件上传到Amazon S3

  22. 22

    将本地文件上传到amazon aws s3时如何获取本地文件?

  23. 23

    akka.http.scaladsl.model.ParsingException:使用akka http将大文件上传到S3时,多部分实体意外结束

  24. 24

    使用Ruby SDK将文件上传到Amazon S3

  25. 25

    将大文件夹上传到Amazon S3

  26. 26

    将大文件夹上传到Amazon S3

  27. 27

    使用Ajax和Boto3 for Django将文件上传到S3

  28. 28

    如何使用Node将图像上传到S3

  29. 29

    使用 rails、carrierwave-direct 和 jquery 文件上传将文件上传到客户端的 s3

热门标签

归档