Julia:将带有NaN值的矩阵写入二进制文件



我有一个包含Float64的矩阵,可能还有一些NaN条目。我想把它保存为二进制文件(因为这是最快的,速度在这里很重要(,例如

io = open(string(saveto_dir,"/arr"),"w")
@time write(io,arr) 
close(io)

然而,Julia给出了错误信息:

`write` is not supported on non-isbits arrays

有变通办法吗?

这听起来像是由于(可能是无意中(使用了类型为Any(即Array{Any}(的Array,但如果您的数据如所述,则可以使用Array{Float64},在这种情况下不会出现此问题。

举一个具体的例子,写

arr = Any[1.0, NaN]
io = open("./arr","w")
write(io,arr) 
close(io)

给出了您所描述的错误,但如果您将其更改为

arr = Float64[1.0, NaN]
io = open("./arr","w")
write(io,arr) 
close(io)

没有错误。

一般来说,当有任何其他可行的选择时,应该强烈避免Array{Any}(或真正涉及Any的任何事情(,这实际上是由于类型不稳定。例如:

julia> A = rand(10000); # Array{Float64}
julia> B = Any[A...]; # Array{Any}
julia> using BenchmarkTools
julia> @benchmark sum($A)
BechmarkTools.Trial: 10000 samples with 10 evaluations.
Range (min … max):  1.318 μs …  12.705 μs  ┊ GC (min … max): 0.00% … 0.00%
Time  (median):     1.347 μs               ┊ GC (median):    0.00%
Time  (mean ± σ):   1.400 μs ± 269.376 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%
▇█▅▂▂▂      ▃       ▂▂                                    ▁ ▂
██████▇▆▁▅▅███▇▁▃▃▁▁██▆▅▃▄▃▃▁▁▁▁▁▁▁▁▁▁▁▁▃▁▃▃▁▃▁▁▃▁▁▁▃▁▁▃▁▇█ █
1.32 μs      Histogram: log(frequency) by time      2.62 μs <
Memory estimate: 0 bytes, allocs estimate: 0.
julia> @benchmark sum($B)
BechmarkTools.Trial: 10000 samples with 1 evaluations.
Range (min … max):  185.967 μs …  1.664 ms  ┊ GC (min … max): 0.00% … 75.01%
Time  (median):     195.609 μs              ┊ GC (median):    0.00%
Time  (mean ± σ):   213.615 μs ± 62.394 μs  ┊ GC (mean ± σ):  1.31% ±  4.62%
▅██▅▄▅▃▃▂▂▄▃▁▂▁▁▂▄▁▁    ▃▃                                 ▂ ▂
███████████████████████▇████▆▆▇▆▄▄▄▃▄▃▅▄▄▅▄▁▅▃▄▅▅▃▄▃▃▄▄▅▁▄▅█ █
186 μs        Histogram: log(frequency) by time       413 μs <
Memory estimate: 156.23 KiB, allocs estimate: 9999.

大约100倍的性能差异是相当典型的(还要注意分配数量的差异(。

最新更新