以下代码可以在 Julia REPL 中运行,展示了如何将向量的内容写入磁盘。
v = rand(Int64, 1000000)
ofile = open("example_vector.bin", "w")
write(ofile, v)
close(ofile)
反向操作大概也是可能的,但我无法找出正确的语法。
ifile = open("example_vector.bin", "r")
v2 = Vector{Int64}(undef, 1000000)
read(ifile, v) # this is not valid, perhaps unsurprisingly
# I tried a few other things which I thought might work, but none did
read(ifile, Vector{Int64}, 1000000)
read(ifile, Vector{Int64, 1000000})
read(ifile, ::Type{Vector{Int64}}, 1000000)
我已经尝试过以下事情:
- 在网上搜索解决方案
- 询问 ChatGPT(不出所料,它编造了一个不存在的函数调用)
- 阅读在 REPL 中
read
使用该模式的文档?
我想要避免的是必须进行 100 万次函数调用来read
单独读取向量的每个元素,这可能会导致性能不佳。
每当你寻找一个可以就地工作或改变参数的函数时,你都在寻找以 结尾的函数
!
。在这种情况下,你正在寻找read!
,它正是你想要的:https://docs.julialang.org/en/v1/base/io-network/#Base.read!
注意:上面的链接行为很奇怪,当我单击它时,结尾的 !I 会被忽略,因此您可能需要剪切并粘贴它。
read
有一个可能对你有帮助的重载:它从输入流中读取最多 n 个字节,并将它们存储为
Vector{UInt8}
原始二进制数据。之后,您的工作就是将这些二进制数据强制转换为预期的Vector{Int64}
。与逐个读取字节相比,此解决方案可能更有效,但是,它需要O(N)
线性扫描以进行强制转换和O(N)
额外的内存。