我需要处理大量文本文件。现在表现非常好,感谢pmap()
,但我正在寻找额外的加速。当前的瓶颈是将字符串解析为浮点数。
我想到了加载我的数据(管道分隔的文本文件)并将它们写成二进制格式。从我所看到的,Julia应该能够以这种方式更快地加载我的数据。问题是我在将二进制数据写成二进制文件后将其二进制数据加载到Julia中的方法有些麻烦。
这是我用于加载,解析和写入二进制文件的一些示例代码:
input_file = "/cool/input/file.dat" ## -- pipe delimited text file of Floats
output_file = "/cool/input/data_binary"
open(input_file, "r") do in_file
open(output_file, "w") do out_file
for line in eachline(in_file)
split_line = split(line, '|')
out_float = parse(Float64, split_line[4])
write(out_file, out_float)
end
end
end
问题在于,当我将上述文件加载到Julia时,我不知道这些值是什么:
read(output_file)
n-element Array{UInt8,1}:
0x00
0x00
0x00
0x00
0x00
0x80
0x16
如何在Julia代码中将这些二进制值用作浮点数?更一般地说,如果我正在寻找性能提升,以这种方式将我的文本文件数据转换为二进制文件是否有意义?
答案 0 :(得分:2)
我不知道我获得了多少实际加速,但是当我存储大量非结构化变量时,我使用.h5 format存储了一些东西(而不是我存储在关系数据库中的东西)。 json文件)
答案 1 :(得分:2)
来自julia会话工作区的“保存”数据的官方解决方案/格式为JLD package。
将此视为matlab中的.mat
文件或python中的shelve
的等效文件。
或者,您可以使用serialize
命令直接将数据序列化为文件(但请阅读JLD页面中的注意事项)。
如果您需要这种特定的“自制”序列化方法,您可以在问题中描述与特定项目有关的特定目的,那么很好。但除此之外,它听起来只是想要有效地存储和访问序列化数据,因此请使用JLD。
示例:
### in file "floats.dat"
1.0|2.0|3.0|4.0|5.0|6.0|7.0|8.0|9.0|10.0
# Using .jld files
julia> using JLD
julia> S = split( chomp( readstring("floats.dat")), '|');
julia> Floats = [parse(Float64, x) for x in S];
julia> save("myFloats.jld","Floats",Floats)
julia> load("myFloats.jld")
Dict{String,Any} with 1 entry:
"Floats" => [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]
# Using serialize / deserialize
julia> S = split( chomp( readstring("floats.dat")), '|');
julia> Floats = [parse(Float64, x) for x in S];
julia> f = open("out.dat", "w"); serialize(f, Floats); close(f);
julia> f = open("out.dat", "r"); show(deserialize(f))
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]