gpt4 book ai didi

ruby-on-rails - 将 CSV 流从 Ruby 上传到 S3

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:00 28 4
gpt4 key购买 nike

我正在处理潜在的巨大 CSV 文件,我想从我的 Rails 应用程序导出这些文件,并且由于它在 Heroku 上运行,我的想法是在生成这些 CSV 文件时将它们直接流式传输到 S3。

现在,我遇到了一个问题,因为 Aws::S3 需要一个文件才能执行上传,而在我的 Rails 应用程序中我想做类似的事情:

S3.bucket('my-bucket').object('my-csv') << %w(this is one line)

我怎样才能做到这一点?

最佳答案

您可以使用 s3 分段上传,允许通过将大对象拆分为多个 block 来上传。 https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html

分段上传需要更复杂的编码,但aws-sdk-ruby V3支持upload_stream方法,似乎在内部执行分段上传,而且非常容易使用。也许是这个用例的确切解决方案。 https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html#upload_stream-instance_method

client = Aws::S3::Client.new(
region: 'ap-northeast-1',
credentials: your_credential
)

obj = Aws::S3::Object.new('your-bucket-here', 'path-to-output', client: client)

require "csv"
obj.upload_stream do |write_stream|
[
%w(this is first line),
%w(this is second line),
%w(this is third line),
].each do |line|
write_stream << line.to_csv
end
end
this,is,first,line
this,is,second,line
this,is,third,line

upload_stream block 的参数通常可以用作 IO 对象,它允许您像处理文件或其他 IO 对象一样链接和包装 CSV 生成:

obj.upload_stream do |write_stream|
CSV(write_stream) do |csv|
[
%w(this is first line),
%w(this is second line),
%w(this is third line),
].each do |line|
csv << line
end
end
end

或者,例如,您可以在生成和上传 CSV 时压缩它,使用临时文件来减少内存占用:

obj.upload_stream(tempfile: true) do |write_stream|
# When uploading compressed data, use binmode to avoid an encoding error.
write_stream.binmode

Zlib::GzipWriter.wrap(write_stream) do |gzw|
CSV(gzw) do |csv|
[
%w(this is first line),
%w(this is second line),
%w(this is third line),
].each do |line|
csv << line
end
end
end
end

已编辑:在压缩示例代码中,您必须添加 binmode 以修复以下错误:

Aws::S3::MultipartUploadError: multipart upload failed: "\x8D" from ASCII-8BIT to UTF-8

关于ruby-on-rails - 将 CSV 流从 Ruby 上传到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com