我想加密和解密大文件(想想 20m 行)的文本。我使用的加密服务最多只能加密 64kb。出于此问题的目的,假设我们坚持使用此服务。
我的解决方案是将大文件分成 64kb 的块,并行加密所有文件,然后将加密的部分放入tar.gz
. 每个部分都有编号,part-xxx
以确保我可以恢复原始文件。在解密时我解压缩,并行解密每个部分并按顺序连接结果。
有趣的部分:当我在足够大的文件上执行最后一部分时,会发生以下情况之一:
tmux 会话终止,我被注销。没有日志,什么都没有。
我明白了:
/home/estergiadis/kms/decrypt.sh: line 45: /usr/bin/find: Argument list too long
/home/estergiadis/kms/decrypt.sh: line 46: /bin/rm: Argument list too long
我尝试了几种基于 xargs 的解决方案,但没有成功。这是有趣的代码:
echo "Decrypting chunks in parallel."
# -1 -f in ls helped me go from scenario 1 to scenario 2 above.
# Makes sense since I don't need sorting at this stage.
ls -1 -f part-* | xargs -I % -P 32 bash -c "gcloud kms decrypt --ciphertext-file % --plaintext-file ${OUTPUT}.%"
# Best case scenario, we die here
find $OUTPUT.part-* | xargs cat > $OUTPUT
rm $OUTPUT.part-*
更有趣的是:当 find 和 rm 报告问题时,我可以转到包含所有部件的临时文件夹,自己运行完全相同的命令,一切正常。
万一这很重要,所有这些都发生在 RAM 挂载的文件系统中。但是 RAM 不可能是问题:我在一台 256GB RAM 的机器上,所涉及的文件占用 1-2GB 并且htop
从未显示超过 10% 的使用率。