如何解决读取cmd以流式传输到Julia中的BSON
我有curl命令,我想使用BSON加载其输入。 出于性能原因,我想将curl输出直接读取到内存中,而不将其保存到文件中。 另外,我想尽快关闭curl,所以我想从curl中读取数据,然后将它们传递给BSON,打开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,World!"
第一个版本与您的第一个版本相似,但是下载完成后立即关闭卷曲过程。第二个版本将curl调用的结果读取到字节向量中,将其包装在IOBuffer
中,然后在其上调用BSON.load
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。