Сжатие
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
.
Имейте в виду: чтобы происходили сжатие и распаковка, пакет |
Выбор алгоритма сжатия
Если вы хотите использовать другой алгоритм сжатия, которые лучше подходит под ваши потребности, упаковщик можно передать напрямую.
Библиотека | Упаковщик | |
---|---|---|
|
|
Вариант по умолчанию из-за своего широкого применения. |
|
|
Может работать в разы быстрее. |
|
|
Быстрый, но несовместим с упаковщиком 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