記憶體對映的 I/O
mmap(檔案記憶體對映)的低階模組。
Mmap.Anonymous
— 類型Mmap.Anonymous(name::AbstractString="", readonly::Bool=false, create::Bool=true)
建立一個類似 IO
的物件,用於建立未歸零的 mmap 記憶體,不連結到檔案,供 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
的記憶體中版本與磁碟版本之間的同步。