【发布时间】:2020-09-09 15:40:22
【问题描述】:
我有 curl 命令,我想使用 BSON 加载其输入。 出于性能原因,我想将 curl 输出直接读取到内存中,而不是将其保存到文件中。 另外,我想尽快关闭 curl,所以我想从 curl 中读取数据,然后将它们传递给 BSON,当 curl 打开时我们遇到了一些问题,因为它比连续解析更快。
我知道这行得通,但它使 curl 保持打开的时间过长,当我们一次并行执行多次并且我们从中下载的服务器有点忙时,这会导致问题。
using BSON
cmd = `curl <some data>`
BSON.load(open(cmd))
要尽快关闭cmd,我有这个:
# created IOBuffer to wrap bytes
import BSON.load
function BSON.load(bytes::Vector{UInt8})
io = IOBuffer()
write(io, bytes)
seekstart(io)
BSON.load(io)
end
cmd = `curl <some data>`
BSON.load(read(cmd))
这行得通,但我认为它非常难看。此外,我不确定这是否会降低性能。
有没有更优雅的方法来做到这一点?我可以将read(cmd) 放入一些 IO 结构中,然后将其传递给BSON.load 吗?
我意识到Serialization.deserialize 存在完全相同的问题。我的反序列化解决方案是相同的,但我欢迎任何改进。
【问题讨论】:
-
当你说“但是它让 curl 保持打开的时间太长,当我们一次并行执行多次并且我们下载的服务器有点忙时会导致问题”你的意思是BSON.load 比下载慢所以它会阻止下载过程?
-
是的,完全正确。但主要发生在 JSON.parse 期间,解析 json 比通过 curl 下载花费的时间更长。我们的对象存储与 Julia 的服务器位于同一个数据中心,因此速度非常快。