Memory-mapped I/O
低级模块用于 mmap(文件的内存映射)。
Mmap.Anonymous
— TypeMmap.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
— Functionmmap(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
及其所做的更改是否对映射同一文件的其他进程可见。
例如,以下代码
# 创建一个用于 mmapping 的文件
# (您也可以使用 mmap 来执行此步骤)
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# 我们将数组的维度写入文件的前两个 Ints
write(s, size(A,1))
write(s, size(A,2))
# 现在写入数据
write(s, A)
close(s)
# 通过读取它来测试
s = open("/tmp/mmap.bin") # 默认是只读
m = read(s, Int)
n = read(s, Int)
A2 = mmap(s, Matrix{Int}, (m,n))
创建一个与流 s
关联的 m
行 n
列的 Matrix{Int}
。
一个更便携的文件需要在头部编码字大小 – 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")
这创建了一个 25x30000 的 BitArray
,与流 io
关联的文件相关联。
Mmap.sync!
— FunctionMmap.sync!(array)
强制在内存映射的 Array
或 BitArray
的内存版本与磁盘版本之间进行同步。