Сжатие

JLD2 поддерживает сжатие массивов isbits. Это относится как к обычным массивам Array{Float64}, так и к массивам пользовательских структур, которые являются неизменяемыми и состоят из полей лишь базовых числовых типов.

Чтобы включить сжатие по умолчанию, можно использовать следующий вызов:

FileIO.save("example.jld2", "large_array", zeros(10000); compress = true)

с применением API FileIO. Кроме того, можно использовать такой вызов:

jldsave("example.jld2", true; large_array=zeros(10000))

либо такой:

jldopen("example.jld2", "w"; compress = true) do f
    f["large_array"] = zeros(10000)
end

При считывании файла JLD2 определяет, что он сжат, и автоматически распаковывает данные, так что передавать дополнительные параметры не нужно.

Для работы с алгоритмами сжатия JLD2 использует пакет TranscodingStreams.jl. По умолчанию сжатие отключено, и при передаче compress = true используется пакет CodecZlib.jl.

Имейте в виду: чтобы происходили сжатие и распаковка, пакет CodecZlib.jl необходимо установить явным образом. Если он еще не загружен, JLD2 попытается загрузить его динамически, но рекомендуется делать это явным образом, например using JLD2, CodecZlib.

Выбор алгоритма сжатия

Если вы хотите использовать другой алгоритм сжатия, которые лучше подходит под ваши потребности, упаковщик можно передать напрямую.

Библиотека Упаковщик

CodecZlib.jl

ZlibCompressor

Вариант по умолчанию из-за своего широкого применения.

CodecBzip2.jl

Bzip2Compressor

Может работать в разы быстрее.

CodecLz4.jl

LZ4FrameCompressor

Быстрый, но несовместим с упаковщиком LZ4, входящим в состав HDF5.

Для использования любого из этих упаковщиков замените аргумент compress = true экземпляром упаковщика, например:

using JLD2, CodecBzip2
jldopen("example.jld2", "w"; compress = Bzip2Compressor()) do f
    f["large_array"] = zeros(10000)
end

Ручной выбор сжатия для наборов данных

Иногда бывает известно, что некоторые имеющиеся массивы легко поддаются сжатию, а для других результат не стоит затраченных усилий. Для точного управления сжатием функция write принимает необязательный именованный аргумент, переопределяющий настройки сжатия файла.

using JLD2
jldopen("example.jld2", "w") do f
    # Сжатие будет эффективным → использовать сжатие
    write(f, "compressed_array", zeros(10000); compress=true)

    # Это сжимать не нужно
    write(f, "large_array", rand(10000))
end