Документация Engee

Ввод-вывод, отображаемый в памяти

Низкоуровневый модуль для сопоставления файлов в памяти.

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(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 и внесенные в него изменения видны другим процессам, сопоставленным с тем же файлом.

Например, следующий код:

# Создаем файл для сопоставления в памяти
# (на этом шаге также можно использовать mmap)
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# Измерения массива записываются в файл как два первых целых числа
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))

создает матрицу Matrix{Int} размером m на n, которая привязана к файлу, связанному с потоком 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 на 30 000, который привязан к файлу, связанному с потоком io.

Mmap.sync!(array)

Выполняет принудительную синхронизацию между хранящейся в памяти версией сопоставленного в памяти массива Array или BitArray и версией на диске.