Memory-mapped I/O

Módulo de bajo nivel para mmap (mapeo de memoria de archivos).

Mmap.AnonymousType
Mmap.Anonymous(name::AbstractString="", readonly::Bool=false, create::Bool=true)

Crea un objeto similar a IO para crear memoria mapeada en cero que no está vinculada a un archivo para su uso en mmap. Utilizado por SharedArray para crear arreglos de memoria compartida.

Ejemplos

julia> using Mmap

julia> anon = Mmap.Anonymous();

julia> isreadable(anon)
true

julia> iswritable(anon)
true

julia> isopen(anon)
true
source
Mmap.mmapFunction
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)

Crea un Array cuyos valores están vinculados a un archivo, utilizando mapeo de memoria. Esto proporciona una forma conveniente de trabajar con datos demasiado grandes para caber en la memoria de la computadora.

El tipo es un Array{T,N} con un elemento de tipo bits T y dimensión N que determina cómo se interpretan los bytes del array. Ten en cuenta que el archivo debe estar almacenado en formato binario, y no se pueden realizar conversiones de formato (esta es una limitación de los sistemas operativos, no de Julia).

dims es una tupla o un solo Integer que especifica el tamaño o la longitud del array.

El archivo se pasa a través del argumento de flujo, ya sea como un IOStream abierto o como una cadena de nombre de archivo. Cuando inicializas el flujo, usa "r" para un array de "solo lectura", y "w+" para crear un nuevo array utilizado para escribir valores en el disco.

Si no se especifica un argumento type, el valor predeterminado es Vector{UInt8}.

Opcionalmente, puedes especificar un desplazamiento (en bytes) si, por ejemplo, deseas omitir un encabezado en el archivo. El valor predeterminado para el desplazamiento es la posición actual del flujo para un IOStream.

El argumento de palabra clave grow especifica si el archivo en disco debe crecer para acomodar el tamaño solicitado del array (si el tamaño total del archivo es < tamaño solicitado del array). Se requieren privilegios de escritura para hacer crecer el archivo.

El argumento de palabra clave shared especifica si el Array resultante y los cambios realizados en él serán visibles para otros procesos que mapeen el mismo archivo.

Por ejemplo, el siguiente código

# Crear un archivo para mmapping
# (también podrías usar mmap para hacer este paso)
using Mmap
A = rand(1:20, 5, 30)
s = open("/tmp/mmap.bin", "w+")
# Escribiremos las dimensiones del array como los primeros dos Ints en el archivo
write(s, size(A,1))
write(s, size(A,2))
# Ahora escribe los datos
write(s, A)
close(s)

# Prueba leyéndolo de nuevo
s = open("/tmp/mmap.bin")   # el predeterminado es solo lectura
m = read(s, Int)
n = read(s, Int)
A2 = mmap(s, Matrix{Int}, (m,n))

crea un Matrix{Int} de m por n, vinculado al archivo asociado con el flujo s.

Un archivo más portátil necesitaría codificar el tamaño de palabra – 32 bits o 64 bits – y la información de orden de bytes en el encabezado. En la práctica, considera codificar datos binarios utilizando formatos estándar como HDF5 (que se puede usar con mapeo de memoria).

source
mmap(io, BitArray, [dims, offset])

Crea un BitArray cuyos valores están vinculados a un archivo, utilizando mapeo de memoria; tiene el mismo propósito, funciona de la misma manera y tiene los mismos argumentos que mmap, pero la representación en bytes es diferente.

Ejemplos

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")

Esto crea un BitArray de 25 por 30000, vinculado al archivo asociado con el flujo io.

source
Mmap.sync!Function
Mmap.sync!(array)

Fuerza la sincronización entre la versión en memoria de un Array mapeado en memoria o BitArray y la versión en disco.

source