Archive : Add archive_mt that uses threaded XZ.

This commit is contained in:
Dmitry Voronin 2024-01-03 16:40:51 +03:00
parent c46671393e
commit 6d10fdeb75
2 changed files with 34 additions and 0 deletions

View file

@ -26,6 +26,35 @@ function archive() {
_iterate_targets process ${targets[@]}
}
# Archive using multiple threads. Uses 50% of free RAM.
# All directories by default.
# Usage: archive_mt [DIRS]
function archive_mt() {
local IFS=$'\n'
local targets=(${@})
[[ "${targets}" = "" ]] && targets=($(_ls_dir))
process() {
local date=$(_archive_date)
# Parse name.
local name=$(parse_pascal ${target})
# Determine memory limit.
local mem_free=$(_mem_free)
local mem_limit=$((mem_free/2))
# create archive.
local hash=$(tar -c ${target} | pv -s $(/usr/bin/du -sb ${target} | awk '{print $1}') | xz -9e --threads=0 --memlimit=${mem_limit}MiB | tee ${name}.txz | sha1sum | cut -d\ -f1)
# append hash to target name.
local new_name="${name}_${date}-${hash}.txz"
mv -- ${name}.txz ${new_name} && echo ${new_name}
}
_iterate_targets process ${targets[@]}
}
# Archive directories with fast compression.
# All directories by default.
# Usage: archive_fast [DIRS]

View file

@ -3,6 +3,11 @@ function _core_count() {
cat /proc/cpuinfo | grep ^processor | wc -l
}
# Get the number of available memory (in mebibytes).
function _mem_free() {
free -m | sed -n -e '2p' | awk '{print $7}'
}
# Parse integers from mixed string.
function _parse_ints() {
echo "${*}" | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g'