Внутренние компоненты и структура
Файловый интерфейс
Объект JLDFile имитирует API Base.Dict
в максимальной степени. В частности, keys
, length
, haskey
, isempty
, get
, get!
должны работать, как ожидается.
#
JLD2.CommittedDatatype
— Type
CommittedDatatype
Ссылка на сообщение об общем типе данных (хранящемся где-либо еще в файле). Хранится в группе _types
и индексируется.
#
JLD2.CustomSerialization
— Type
CustomSerialization{T,S}
Дисковое представление данных, которые записываются так, как если бы они имели тип Julia T
, но считываются как тип S
.
#
JLD2.GlobalHeap
— Type
GlobalHeap
Представляет структуру глобальной кучи HDF5.
#
JLD2.Group
— Type
Group(file)
Объект группы JLD2.
Расширенное использование
Принимает два необязательных именованных аргумента: estnumentries::Int=4 estlinkname_len::Int=8 Они определяют, сколько (дополнительного) пустого пространства следует выделить для описания группы (списка записей). Это может быть полезно с точки зрения производительности, если после первоначальной записи в файл в него планируется добавлять много дополнительных наборов данных.
#
JLD2.Group
— Method
Group(f::JLDFile, name::AbstractString)
Создает пустую группу с именем name
на верхнем уровне файла JLDFile
f
.
#
JLD2.Group
— Method
Group(g::Group, name::AbstractString)
Создает группу с именем name
, которая будет дочерней для группы g
.
#
JLD2.H5Datatype
— Type
H5Datatype
Супертип всех типов данных HDF5.
#
JLD2.IndirectPointer
— Type
IndirectPointer
При записи данных может потребоваться расширить сопоставление памяти, что сделает недействительными все адреса в памяти, связанные с прежним указателем mmap
. IndirectPointer
содержит указатель на поле startptr
MmapIO и смещение относительно этого указателя. Вычисление адреса в памяти откладывается до преобразования в Ptr{T}, поэтому сопоставление памяти можно расширить с сохранением адресов.
#
JLD2.InlineUnionEl
— Type
InlineUnionEl{T1,T2}(mask::UInt8, t1::T1, t2::T2)
Пользовательская структура сериализации для двух полей, входящих в битовое объединение, например в других структурах или массивах. Для указания на то, что актуально поле t1, маска принимает значение UInt8(0)
, а для t2 — UInt8(255)
.
#
JLD2.JLDFile
— Type
JLDFile{T<:IO}
Объект файла JLD.
#
JLD2.JLDWriteSession
— Type
JLDWriteSession{T}
JLDWriteSession отслеживает ссылки на сериализованные объекты. Если T
— это словарь, h5offset
сопоставляет идентификатор объекта (возвращаемый вызовом objectid
) с RelOffset
записываемого набора данных. Если это Union{}
, ссылки не отслеживаются, а объекты, на которые указывают несколько ссылок, записываются несколько раз.
#
JLD2.ReadRepresentation
— Type
ReadRepresentation{T,ODR}
Тип, кодирующий как тип Julia T
, так и дисковое (HDF5) представление ODR
.
#
JLD2.RelOffset
— Type
RelOffset
Представляет относительное смещение HDF5. Отличается от файлового смещения (используемого в остальных случаях) тем, что задается относительно базового адреса суперблока. fileoffset
и h5offset
преобразуются между RelOffsets
и файловыми смещениями.
SharedDatatype
Ссылка на сообщение об общем типе данных (хранящемся где-либо еще в файле).
#
JLD2.TypeMappingException
— Type
constructrr(f::JLDFile, T::DataType, dt::CompoundType, attrs::Vector{ReadAttribute}, hard_failure::Bool=false)
Создает ReadRepresentation для указанного типа. Это универсальный метод для всех типов, которые не обрабатываются особым образом ниже.
Если hard_failure имеет значение true, вызывается исключение TypeMappingException вместо попытки воссоздания. Это полезно в случаях, если невозможно узнать, будут ли воссоздаваемые параметрические типы иметь аналогичную структуру в памяти, не проанализировав структуру памяти заранее.
#
JLD2.Upgrade
— Type
Upgrade(T)
Задает путь обновления для сериализуемых структур с использованием именованного аргумента typemap
и rconvert
.
#
JLD2.behead
— Method
behead(T)
Для типа UnionAll рекурсивно устраняет предложения where
.
#
JLD2.construct_array
— Method
construct_array{T}(io::IO, ::Type{T}, ::Val{ndims})
Создает массив путем считывания измерений ndims
из io
. Предполагается, что в io
уже выполнен переход в правильную позицию.
#
JLD2.fileoffset
— Method
fileoffset(f::JLDFile, x::RelOffset)
Преобразовывает смещение x
относительно суперблока файла f
в абсолютное смещение.
#
JLD2.group_payload_size
— Method
group_payload_size(g)
Возвращает размер полезных данных группы, включая сведения о ссылках, сведения о группе и сообщения ссылок, но не заголовок объекта. Предоставляет пространство после сообщения последнего объекта для продолжения сообщения.
#
JLD2.h5offset
— Method
h5offset(f::JLDFile, x::Integer)
Преобразовывает абсолютное файловое смещение x
в смещение относительно суперблока файла f
.
#
JLD2.jld_finalizer
— Method
jld_finalizer(f::JLDFile)
При ликвидации JLDFile объект MmapIO
может оказаться несопоставленным в памяти, так как очередность ликвидации в Julia не гарантируется. Это означает, что исходный файл может быть закрыт, прежде чем появится возможность записи в него.
#
JLD2.jldopen
— Function
jldopen(fname::AbstractString, mode::AbstractString; iotype=MmapIO, compress=false, typemap=Dict())
Открывает файл JLD2 по пути fname
.
"r"
: файл открывается только для чтения; если файл не существует, происходит сбой. "r+"
: файл открывается для чтения и записи; если файл не существует, происходит сбой. "w"
/"w+"
: файл открывается для чтения и записи; если файл уже существует, он перезаписывается. "a"
/"a+"
: файл открывается для чтения и записи; если файл не существует, создается новый файл. preserving the existing file if one is present
#
JLD2.jldsave
— Method
jldsave(filename, compress=false; kwargs...)
Создает файл JLD2 по пути filename
и сохраняет переменные, переданные в качестве именованных аргументов.
Примеры
jldsave("example.jld2"; a=1, b=2, c)
эквивалентно
jldopen("example.jld2, "w") do f f["a"] = 1 f["b"] = 2 f["c"] = c end
Чтобы выбрать тип ввода-вывода IOStream
вместо типа по умолчанию MmapIO
, используйте jldsave(fn, IOStream; kwargs...)
.
#
JLD2.link_size
— Method
link_size(name::String)
Возвращает размер сообщения ссылки, включая заголовок сообщения.
#
JLD2.links_size
— Method
links_size(pairs)
Возвращает размер нескольких сообщений ссылок. pairs
— это итератор пар String => RelOffset
.
#
JLD2.load_attributes
— Method
load_attributes(f::JLDFile, name::AbstractString)
load_attributes(g::Group, name::AbstractString)
load_attributes(f::JLDFile, offset::RelOffset)
Возвращает список атрибутов, назначенных набору данных или группе.
#
JLD2.load_datatypes
— Method
load_datatypes(f::JLDFile)
Заполняет f.datatypes и f.jlh5types всеми сохраненными типами данных из файла. Это необходимо сделать перед записью, чтобы повторно использовались записанные типы данных.
#
JLD2.load_object
— Method
load_object(filename)
Возвращает единственный доступный объект из JLD2-файла filename
(имя хранимого объекта не имеет значения). Если файл содержит несколько объектов или не содержит ни одного, эта функция выводит ошибку ArgumentError
.
Пример
Загрузка только одного объекта из JLD2-файла example.jld2:
hello = "world" save_object("example.jld2", hello) hello_loaded = load_object("example.jld2")
#
JLD2.lookup_offset
— Method
lookup_offset(g::Group, name::AbstractString) -> RelOffset
Ищет смещение набора данных в группе. Возвращает UNDEFINED_ADDRESS
, если набор данных отсутствует. Не проверяет unwritten_child_groups
.
#
JLD2.pathize
— Method
pathize(g::Group, name::AbstractString, create::Bool) -> Tuple{Group,String}
Преобразует путь в объект группы и имени. Если аргумент create
имеет значение true, создаются промежуточные группы, а имя набора данных сравнивается с существующими для проверки уникальности.
#
JLD2.prewrite
— Method
prewrite(f::JLDFile)
Проверяет, действительно ли файл JLD доступен для записи, и выдает ошибку, если это нет так. Задает флаг written
для файла.
#
JLD2.printtoc
— Method
printtoc([io::IO,] f::JLDFile [; numlines])
Выводит обзор содержимого файла f
в IO
.
С помощью необязательного параметра numlines
можно ограничить число элементов в списке.
#
JLD2.read_array!
— Function
read_array!(v::Array, f::JLDFile, rr)
Заполняет массив v
содержимым файла JLD f
в текущей позиции с использованием ReadRepresentation rr
.
#
JLD2.read_attr_data
— Method
read_attr_data(f::JLDFile, attr::ReadAttribute, expected_datatype::H5Datatype,
rr::ReadRepresentation)
Считывает данные из атрибута с использованием определенного типа данных HDF5 и ReadRepresentation. При несоответствии типа данных HDF5 вызывает исключение UnsupportedFeatureException
. Таким образом, обеспечивается большая стабильность типов с одновременной проверкой данных.
#
JLD2.read_attr_data
— Method
read_attr_data(f::JLDFile, attr::ReadAttribute)
Считывает данные из атрибута.
#
JLD2.read_attribute
— Method
read_attribute(io::IO, f::JLDFile)
Считывает сообщение атрибута в текущей позиции объекта io
. Поддерживается сообщение атрибута версии 1 или 2.
#
JLD2.read_compressed_array!
— Function
read_compressed_array!(v::Array, f::JLDFile, rr, data_length::Int, ::Val{filter_id})
Заполняет массив v
сжатым содержимым файла JLD f
в текущей позиции с использованием ReadRepresentation rr
, причем предполагается, что сжатые данные имеют длину data_length
.
#
JLD2.read_data
— Function
read_data(f::JLDFile, dataspace::ReadDataspace, datatype_class::UInt8,
datatype_offset::Int64, data_offset::Int64[, filters::FilterPipeline,
header_offset::RelOffset, attributes::Vector{ReadAttribute}])
Считывает данные из файла. Если datatype_class
имеет значение typemax(UInt8), тип данных считается сохраненным, а datatype_offset
указывает на смещение заголовка сохраненного типа данных. В противном случае datatype_offset указывает на смещение атрибута типа данных.
#
JLD2.read_scalar
— Function
read_scalar(f::JLDFile, rr, header_offset::RelOffset)
Считывает необработанные данные, представляющие скаляр, с использованием представления чтения rr
начиная с текущей позиции в файле JLD f
. header_offset
— это смещение RelOffset заголовка объекта, используемое для разрешения циклов.
#
JLD2.read_size
— Method
read_size(io::IO, flags::UInt8)
Загружает размер переменной длины в соответствии с флагами. Предполагается, что первые два бита флага имеют следующе значение: 0 — длина поля имени ссылки имеет размер 1 байт; 1 — длина поля имени ссылки имеет размер 2 байта; 2 — длина поля имени ссылки имеет размер 4 байта; 3 — длина поля имени ссылки имеет размер 8 байтов. Размер возвращается в виде значения типа Int.
#
JLD2.readas
— Method
readas(::Type)::Type
Экспериментальные функции: JLD2.readas
можно перегрузить, чтобы переопределить то, в виде какого типа считывается сохраненный тип; такой вариант применяется для пользовательской сериализации вместе с JLD2.writeas
.
Типичный случай — пользовательская сериализация параметрических типов, когда не все параметры типов доступны во время считывания. Рассмотрим следующий пример для анонимной функции fun
внутри Foo
:
struct Foo{F<:Function}
fun::F
end
struct FooSerialization
fun
end
JLD2.writeas(::Type{<:Foo}) = FooSerialization
Base.convert(::Type{<:FooSerialization}, f::Foo) = FooSerialization(f.fun)
JLD2.readas(::Type{<:FooSerialization}) = Foo
struct UndefinedFunction <:Function
fun
end
(f::UndefinedFunction)(args...; kwargs...) = error("The function $(f.fun) is not defined")
function Base.convert(::Type{<:Foo}, f::FooSerialization)
isa(f.fun, Function) && return Foo(f.fun)
return Foo(UndefinedFunction(f.fun))
end
Если мы включим эти определения, вызовем jldsave("foo.jld2"; foo=Foo(x->x^2))
, перезапустим Julia, включим определения снова и вызовем foo = jldopen("foo.jld2") do io; io["foo"]; end
, то получим foo::Foo{UndefinedFunction}
и foo::FooSerialization
с приведенным выше определением JLD2.readas
и без него, соответственно.
#
JLD2.save_group
— Method
save_group(g::Group) -> RelOffset
Сохраняет группу в файл, обновляя ее, если она уже была сохранена. Возвращает UNDEFINED_ADDRESS, если группа уже была сохранена, или смещение новой группы в противном случае.
#
JLD2.save_object
— Method
save_object(filename, x)
Сохраняет объект x
в новом JLD2-файле в filename
. Если файл существует по этому пути, он будет перезаписан.
Поскольку формат JLD2 требует, чтобы у всех объектов было имя, объект будет сохранен как single_stored_object
. Чтобы сохранить несколько объектов, используйте макрос @save
, jldopen
или API FileIO.
Пример
Сохранение строки hello
в JLD2-файле example.jld2:
hello = "world" save_object("example.jld2", hello)
#
JLD2.shorttypestring
— Method
shorttypestring(::Type{ <:UnknownType})
Преобразовывает UnknownType в соответствующую строку. Используется только в целях создания имен для воссоздаваемых типов. См. также typestring.
#
JLD2.skip_to_aligned!
— Function
skip_to_aligned!(io, rel=0)
Выполняет переход к ближайшей позиции, выровненной по кратному 8 байтов относительно rel
.
#
JLD2.symbol_length
— Method
symbol_length(x::Symbol)
Возвращает длину строки, представленной x
.
#
JLD2.typestring
— Method
typestring(::Type{ <:UnknownType})
Преобразовывает UnknownType в соответствующую строку. Используется только для предупреждения при возникновении ошибок воссоздания. См. также shorttypestring.
#
JLD2.write_link
— Method
write_link(cio, name, offset)
Записывает сообщение ссылки в текущей позиции в cio
.
#
JLD2.@load
— Macro
@load filename var1 [var2 ...]
Загружает одну или несколько переменных var1,...
из JLD2-файла filename
в текущую область и возвращает вектор имен загруженных переменных.
В интерактивном режиме форма вызова @load "somefile.jld2"
загружает все переменные из файла "somefile.jld2"
в текущую область. Эта форма поддерживает только литеральные имена файлов, и ее следует избегать в более стабильном коде, чтобы было понятно, откуда взялись переменные.
Пример
Для загрузки переменных hello
и foo
из файла example.jld2 используйте такой вызов:
@load "example.jld2" hello foo
#
JLD2.@save
— Macro
@save filename var1 [var2 ...]
@save filename {compress=true} var1 name2=var2
Записывает одну или несколько переменных var1,...
из текущей области в файл JLD2 filename
.
Для использования в интерактивном режиме можно сохранить все переменные в глобальной области текущего модуля с помощью @save filename
. В более стабильном коде предпочтительнее использовать явную форму во избежание сохранения лишних переменных.
Пример
Сохранение строки hello
и массива xs
в JLD2-файле example.jld2:
hello = "world" xs = [1,2,3] @save "example.jld2" hello xs
Для передачи параметров в команду сохранения используйте {}
@save "example.jld2" {compress=true} hello xs
Для сохранения переменных под другим именем используйте стандартный синтаксис присваивания
@save "example.jld2" greeting=hello xarray = xs