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.mmap(io::Union{IOStream,AbstractString,Mmap.AnonymousMmap}
          [, type::Type{Array{T,N}}, dims, offset];
          grow::Bool=true,
          shared::Bool=true)
Mmap.mmap(type::Type{Array{T,N}}, dims)

メモリマップを使って、値がファイルとリンクした配列を作成します。大きすぎてコンピューターのメモリに収まらないデータを簡単に処理する手段を提供します。

作成される配列の型は Array{T,N} です。要素型を表すビット型 T と次元 N が配列中のバイトを解釈する方法を決定します。ファイルはバイナリフォーマットで格納されている必要があり、フォーマットの変換は利用できないことに注意してください (これは Julia ではなくオペレーティングシステムの制限です)。

dims はタプルもしくは単一の Integer であり、配列のサイズ (長さ) を指定します。

マップされるファイルは引数 io を通して指定されます。io には開かれた IOStream またはファイル名を表す文字列を渡すことができます。mmap に渡すストリームを初期化するとき、読み込み専用の配列に対するストリームでは "r" を使い、値をディスクに書き込むのに使う新しい配列に対するストリームでは "w+" を使ってください。

引数 type が与えられないと Vector{UInt8} がデフォルトで使われます。

オフセットを offset で指定することもできます。例えばファイルのヘッダーを飛ばす場合などに利用します。offset のデフォルト値は IOStream の現在位置です。

キーワード引数 grow は、要求されたサイズの配列を格納できるようディスク上のファイルを大きくするかどうかを指定します。この処理が行われるのは要求された配列サイズがファイルサイズよりも小さいときだけであり、ファイルを大きくするには書き込み権限が必要です。

キーワード引数 shared は、同じファイルをマップする他のプロセスから返り値の Array およびそれに対する書き込みが見えるかどうかを指定します。

例として次のコードを考えます:

# mmap に使うファイルを作成する (mmap でもよい)。
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# 配列の次元を二つの Int として最初に書き込む。
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.mmap(s, Matrix{Int}, (m,n))

このコードはストリーム s に関連付いたファイルにリンクされた m×nMatrix{Int} を作成します。

ファイルをさらにポータブルにするには、ワードサイズ (32 ビットまたは 64 ビット) とエンディアンの情報をヘッダーに含めることになるでしょう。実際のコードでバイナリデータをエンコードするときは、HDF5 のような標準フォーマットの利用を考えてください (HDF5 フォーマットはメモリマップしながら利用できます)。

Mmap.mmap(io, BitArray, [dims, offset])

メモリマップを使って、値がファイルにリンクされた BitArray を作成します。mmap と同じ目的、同じ動作、同じ引数を持ちますが、バイト表現が異なります。

julia> using Mmap

julia> io = open("mmap.bin", "w+");

julia> B = Mmap.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.mmap(io, BitArray, (25,30000));

julia> C[3, 4000]
true

julia> C[2, 4000]
false

julia> close(io)

julia> rm("mmap.bin")

このコードはストリーム io に関連付いたファイルにリンクされた 25×300000BitArray を作成します。

Mmap.sync! ── 関数
Mmap.sync!(array)

メモリマップされた Array または BitArray のメモリ上のデータとディスク上のデータを強制的に同期します。