在 Julia 中读取 cmd 以流式传输到 BSON

Read cmd to stream to BSON in Julia

我有 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 也存在完全相同的问题。我的反序列化解决方案是相同的,但我欢迎任何改进。

有点不清楚你的问题是什么意思,当你说它“保持卷曲打开太久”时,但这里有两种不同的方法来做到这一点:

julia> using BSON

julia> url = "https://raw.githubusercontent.com/JuliaIO/BSON.jl/master/test/test.bson"
"https://raw.githubusercontent.com/JuliaIO/BSON.jl/master/test/test.bson"

julia> open(BSON.load, `curl -s $url`)
Dict{Symbol,Any} with 2 entries:
  :a => Complex{Int64}[1+2im, 3+4im]
  :b => "Hello, World!"

julia> BSON.load(IOBuffer(read(`curl -s $url`)))
Dict{Symbol,Any} with 2 entries:
  :a => Complex{Int64}[1+2im, 3+4im]
  :b => "Hello, World!"

第一个版本与您的第一个版本相似,但下载完成后会立即关闭 curl 进程。第二个版本将 curl 调用的结果读取到字节向量中,将其包装在 IOBuffer 中,然后对其调用 BSON.load