我在 amazon s3 上有巨大的 csv 文件(100MB+),我想分块读取它们并使用 ruby CSV 库处理它们。我很难为 csv 处理创建正确的 IO 对象:
buffer = TheRightIOClass.new
bytes_received = 0
RightAws::S3Interface.new(<access_key>, <access_secret>).retrieve_object(bucket, key) do |chunk|
bytes_received += buffer.write(chunk)
if bytes_received >= 1*MEGABYTE
bytes_received = 0
csv(buffer).each do |row|
process_csv_record(row)
end
end
end
def csv(io)
@csv ||= CSV.new(io, headers: true)
end
我不知道这里的正确设置应该是什么以及 TheRightIOClass 是什么。我不想使用 StringIO 将整个文件加载到内存中。ruby 中是否有 bufferedio 或 ringbuffer 来执行此操作?如果有人使用线程(无进程)和管道有一个好的解决方案,我很乐意看到它。