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}
с элементом типа bits 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+")
# Мы запишем размеры массива как первые два 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(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")
Это создает BitArray
размером 25 на 30000, связанный с файлом, ассоциированным с потоком io
.
Mmap.sync!
— FunctionMmap.sync!(array)
Принудительно синхронизирует версию в памяти памяти-картированного Array
или BitArray
с версией на диске.