将文本文件存储为二进制文件以便更快地读/写

时间:2016-08-14 16:33:40

标签: julia binaryfiles

我需要处理大量文本文件。现在表现非常好,感谢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代码中将这些二进制值用作浮点数?更一般地说,如果我正在寻找性能提升,以这种方式将我的文本文件数据转换为二进制文件是否有意义?

2 个答案:

答案 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]