gpt4 book ai didi

julia - 将文本文件存储为二进制文件以加快读/写速度

转载 作者:行者123 更新时间:2023-12-04 22:43:13 28 4
gpt4 key购买 nike

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

最佳答案

您需要使用 reinterpret功能:

help?> reinterpret
search: reinterpret

reinterpret(type, A)

Change the type-interpretation of a block of memory. For example,
reinterpret(Float32, UInt32(7)) interprets the 4 bytes corresponding
to UInt32(7) as a Float32. For arrays, this constructs an array with
the same binary data as the given array, but with the specified element
type.

写入数字数据的函数:

julia> function write_data{T<:Number}(file_name::String, data::AbstractArray{T})
open(file_name, "w") do f_out
for i in data
write(f_out, i)
end
end
end
write_data (generic function with 1 method)

随机数据:

julia> data = rand(10)
10-element Array{Float64,1}:
0.986948
0.616107
0.504965
0.673264
0.0358904
0.1795
0.399481
0.233351
0.320968
0.16746

读取二进制数据并将其重新解释为数字数据类型的函数:

julia> function read_data{T<:Number}(file_name::String, dtype::Type{T})
open(file_name, "r") do f_in
reinterpret(dtype, read(f_in))
end
end
read_data (generic function with 1 method)

读取样本数据为 Float64 s 产生与我们编写的相同的数组:

julia> read_data("foo.bin", Float64)
10-element Array{Float64,1}:
0.986948
0.616107
0.504965
0.673264
0.0358904
0.1795
0.399481
0.233351
0.320968
0.16746

重新解释为 Float32 ,自然会产生两倍的数据:

julia> read_data("foo.bin", Float32)
20-element Array{Float32,1}:
1.4035f7
1.87174
-9.17366f25
1.77903
-1.03106f-24
1.75124
1.9495f-20
1.79332
2.88032f-21
1.26856
1.17736f19
1.5545
-3.25944f-18
1.69974
5.25285f-17
1.60835
-3.46489f14
1.66048
1.91915f-25
1.54246

关于julia - 将文本文件存储为二进制文件以加快读/写速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com