内存映射 I/O
mmap(文件内存映射)的低级模块。
Mmap.Anonymous
— 类型Mmap.Anonymous(name::AbstractString="", readonly::Bool=false, create::Bool=true)
创建一个IO
类对象,用于创建未绑定到文件的零填充内存映射内存,以供mmap
使用。由SharedArray
用于创建共享内存数组。
示例
julia> using Mmap
julia> anon = Mmap.Anonymous();
julia> isreadable(anon)
true
julia> iswritable(anon)
true
julia> isopen(anon)
true
Mmap.mmap
— 函数mmap(io::Union{IOStream,AbstractString,Mmap.AnonymousMmap}[, type::Type{Array{T,N}}, dims, offset]; grow::Bool=true, shared::Bool=true)
mmap(type::Type{Array{T,N}}, dims)
创建一个Array
,其值与文件链接,使用内存映射。这提供了一种方便的方法来处理超出计算机内存容量的数据。
该类型为Array{T,N}
,具有T
类型的位类型元素和N
维,决定数组字节的解释方式。请注意,文件必须以二进制格式存储,并且不允许进行任何格式转换(这是操作系统的限制,而不是 Julia 的限制)。
dims
是一个元组或单个Integer
,指定数组的大小或长度。
文件通过流参数传递,可以是打开的IOStream
或文件名字符串。初始化流时,使用"r"
表示“只读”数组,使用"w+"
创建用于将值写入磁盘的新数组。
如果没有指定type
参数,则默认值为Vector{UInt8}
。
可以选择指定偏移量(以字节为单位),例如,要跳过文件中的标头。对于IOStream
,偏移量的默认值为当前流位置。
grow
关键字参数指定是否应扩展磁盘文件以适应请求的数组大小(如果总文件大小<请求的数组大小)。扩展文件需要写入权限。
shared
关键字参数指定生成的Array
及其所做的更改是否对映射相同文件的其他进程可见。
例如,以下代码
# Create a file for mmapping
# (you could alternatively use mmap to do this step, too)
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# We'll write the dimensions of the array as the first two Ints in the file
write(s, size(A,1))
write(s, size(A,2))
# Now write the data
write(s, A)
close(s)
# Test by reading it back in
s = open("/tmp/mmap.bin") # default is read-only
m = read(s, Int)
n = read(s, Int)
A2 = mmap(s, Matrix{Int}, (m,n))
创建一个m
乘n
的Matrix{Int}
,与流s
关联的文件链接。
更便携的文件需要在标头中编码字长信息(32 位或 64 位)和字节序信息。在实际应用中,请考虑使用 HDF5 等标准格式编码二进制数据(可以使用内存映射)。
mmap(io, BitArray, [dims, offset])
创建一个BitArray
,其值与文件链接,使用内存映射;它具有相同的目的、工作方式和参数,与mmap
相同,但字节表示形式不同。
示例
julia> using Mmap
julia> io = open("mmap.bin", "w+");
julia> B = mmap(io, BitArray, (25,30000));
julia> B[3, 4000] = true;
julia> Mmap.sync!(B);
julia> close(io);
julia> io = open("mmap.bin", "r+");
julia> C = mmap(io, BitArray, (25,30000));
julia> C[3, 4000]
true
julia> C[2, 4000]
false
julia> close(io)
julia> rm("mmap.bin")
这将创建一个 25 乘 30000 的 BitArray
,与流 io
关联的文件链接。
Mmap.sync!
— 函数Mmap.sync!(array)
强制内存映射Array
或BitArray
的内存中版本与磁盘上的版本同步。