我有一个包含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倍的性能差异是相当典型的(还要注意分配数量的差异(。