【问题标题】:Read cmd to stream to BSON in Julia在 Julia 中读取 cmd 以流式传输到 BSON
【发布时间】: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 的服务器位于同一个数据中心,因此速度非常快。

标签: io julia buffer


【解决方案1】:

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

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

【讨论】:

  • 哦,open(BSON.load, curl -s $url) 立即关闭?那太棒了。可以肯定的是,它是否存在于文档中?我很难理解进程何时保持打开直到整个缓冲区被读取以及何时立即关闭。
  • 好吧,它会在BSON.load 完成后立即关闭。通常open(f, path) 在打开的文件句柄上调用f,然后无论f 返回还是错误都会关闭。如果您使用?open,这是open 的第一个记录方法。
  • 是的,当我们在它之后进行一些连续解析时,我们遇到了 curl 崩溃的问题,就像那样,有时连接在解析完成之前就中断了。
  • 在这种情况下您可能需要第二个,因为它会一次将所有数据读入一个向量,然后将该向量包装在一个 IO 接口中以将其传递给解析代码。
  • 是的,没错,我使用了第二种解决方案,它解决了大部分晦涩难懂的问题。
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 2014-10-10
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2020-09-06
相关资源
最近更新 更多