【发布时间】:2018-09-21 11:47:43
【问题描述】:
将字符串数组写入.bin格式如下
out = open("string_array.bin","w")
a = ["first string","second string","third string"]
write(out,a)
close(out)
但是在读回数组 a 时,事情开始变得棘手。
out = open("string_array.bin","r")
a = read(out)
close(out)
typeof(a) # returns Array{UInt8,1}
如何将 Array{UInt8,1} 转换回原来的 Array{String,1} 类型的数组?
当字符串数组有 300+ 百万个元素时,它也需要工作,即解决方案必须表现良好。
【问题讨论】:
-
您上面的代码将无法工作,因为
write(out, a)将失败,因为a包含一个字符串并且不支持将此类结构(非 isbits)写入流。此评论适用于 Julia 1.0。在 Julia 0.6 上它可以工作,但它只是在输出中连接字符串,因此不可能解析回它们的原始值。 -
您对 Julia 0.6 的评论完全正确。
-
在 Julia 0.6 中使用 JLD2.jl 应该是安全的,因为下面提到的 JLD2.jl 的问题与将其移植到 Julia 1.0 有关。下面列出的其他选项也可以使用。
-
@BogumiłKamiński 出于好奇,在 v0.7+ 上,使用
unsafe_wrap将String转换为Vector{UInt8}是多么糟糕的想法,将Vector{UInt8}写入a二进制文件,然后您可以从文件中读取Vector{UInt8},并将其转换为String?如果您有Vector{String},那么您可以按顺序执行此操作并使用额外的UInt8来存储每个Vector{UInt8}的长度。 (如果字符串真的很长,则为更大的整数类型)。这是一个可怕的想法吗? (可能只有 5 或 6 行代码) -
@Mr_Holm 另外,我对
Matrix{Float64}进行了类似的练习,发现写入和读取二进制文件是总体上最好的解决方案(目前)。都在this question here
标签: julia binaryfiles