Сжатие
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