gpt4 book ai didi

ruby - 在 Ruby 中的内存转换流中?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:23 29 4
gpt4 key购买 nike

这里的 Node.js 开发人员必须使用 Ruby,所以我对 Ruby 中的很多概念还很陌生,需要一些帮助。

我的用例是我必须从 S3 下载非常大的换行符分隔的 JSON 文件,转换数据,然后将其放回 S3,所有这些都在内存中,而无需将任何内容写入磁盘。

在 Node 中,我可以做这样的事情:

s3DownloadStream('my-file').pipe(transformStream).pipe(backToS3Stream)

这将在对象进入时动态转换对象并将它们同时放入 S3。

我很难找到一个好的行动计划来在 Ruby 中实现同样的行为。我已经看到 IO.pipe 和 Celluloid::IO 作为可能的选项,但它们似乎仍然不太可能做到这一点。

最佳答案

Ruby 没有直接模拟 Node 中的流,但它有 Enumerable 迭代器框架,通过它有 Lazy选项。惰性枚举器是一种只在必要时发出数据的枚举器,这与其他每次都会运行完成的枚举器不同。

如果你设置了一个惰性链,它会一点一点地评估,而不是一次全部评估。

因此您的代码将如下所示:

s3_download('my-file').lazy.map do |...|
# transform stream
end.each do |...|
# pipe back to S3
end

这是一个您可以构建的简单示例:

input = ('a'..'z')

input.lazy.map do |i|
puts 'i=%s' % i

i.upcase
end.each do |j|
puts ' j=%s' % j
end

您可以看到每个值如何单独在链中波动。如果你删除了 lazy,情况就不是这样了,第一个循环运行到完成,缓冲到一个数组中,然后第二个循环开始并处理它直到完成。

节点流比这复杂得多,它们可以执行暂停/恢复、延迟操作而不阻塞等操作,因此在功能方面只有这么多重叠。如果您花时间使用纤程和线程之类的东西,Ruby 可以做到这一点,但这需要大量工作。

关于ruby - 在 Ruby 中的内存转换流中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42288038/

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