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

Io 读取cmd以在Julia中流式传输到BSON,io,julia,buffer,Io,Julia,Buffer,我有curl命令,我想使用BSON加载它的输入。 出于性能原因,我希望将curl输出直接读取到内存中,而不将其保存到文件中。 另外,我想尽快关闭curl,所以我想从curl读取数据,然后将它们传递给BSON,当curl打开时,我们遇到了一些问题,因为它比连续解析更快 我知道这是可行的,但它让curl保持打开的时间太长,这会导致问题,当我们一次并行多次执行此操作时,我们下载的服务器有点忙 using BSON cmd = `curl <some data>` BSON.load(ope

我有curl命令,我想使用BSON加载它的输入。 出于性能原因,我希望将curl输出直接读取到内存中,而不将其保存到文件中。 另外,我想尽快关闭curl,所以我想从curl读取数据,然后将它们传递给BSON,当curl打开时,我们遇到了一些问题,因为它比连续解析更快

我知道这是可行的,但它让curl保持打开的时间太长,这会导致问题,当我们一次并行多次执行此操作时,我们下载的服务器有点忙

using BSON
cmd = `curl <some data>`
BSON.load(open(cmd))
这很管用,但我认为它很难看。此外,我不确定这是否会对性能造成一定的影响

有没有更优雅的方法?我是否可以
将(cmd)
读入某个IO结构,然后将其传递给
BSON.load


我意识到了与
序列化.反序列化
完全相同的问题。我的反序列化解决方案是相同的,但我欢迎任何改进。

当你说它“让卷曲打开太久”时,你的问题的意思有点不清楚,但这里有两种不同的方法:

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

当您说“但是它使curl打开的时间太长,这会导致问题,当我们一次并行多次执行此操作时,我们下载的服务器有点忙”你的意思是BSON.load比下载慢,所以它会阻止下载过程吗?是的,没错。但它主要发生在JSON.parse期间,解析JSON比通过curl下载要花更长的时间。我们的对象存储与Julia的服务器位于同一个数据中心,所以速度非常快。噢,
打开(BSON.load,
curl-s$url
立即关闭?太好了。可以肯定的是,文档中有这样的内容吗?在读取整个缓冲区之前,我很难理解进程何时保持打开状态,以及何时立即关闭。嗯,它在
BSON.load
完成后立即关闭。通常,
open(f,path)
调用打开文件句柄上的
f
,然后关闭,无论
f
返回还是出错。这是第一个记录在案的
open
方法,如果你这样做
?open
。是的,当我们在它之后进行一些连续的解析时,我们遇到了curl崩溃的问题,就像那样,有时连接在解析完成之前被中断。在这种情况下,您可能需要第二个连接,因为它一次将所有数据读入一个向量,然后将该向量包装到IO接口中,以将其传递给解析代码。是的,没错,我使用了第二个解决方案,它解决了大多数这些模糊的问题。
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!"