Encryption 在过多的文件上运行命令
我想加密和解密大文件(想想2000万行)的文本。我正在使用的加密服务最多只能加密64kb。出于这个问题的目的,假设我们一直使用这个服务 我的解决方案是将这个巨大的文件分成64kb的块,并行加密所有文件,并将加密的部分放在Encryption 在过多的文件上运行命令,encryption,xargs,concurrent-processing,Encryption,Xargs,Concurrent Processing,我想加密和解密大文件(想想2000万行)的文本。我正在使用的加密服务最多只能加密64kb。出于这个问题的目的,假设我们一直使用这个服务 我的解决方案是将这个巨大的文件分成64kb的块,并行加密所有文件,并将加密的部分放在tar.gz中。每个零件编号为零件xxx,以确保我可以恢复原始文件。在解密时,我解压,并行解密每个部分,并按顺序解密结果 有趣的部分:当我在一个足够大的文件上完成最后一部分时,会发生以下情况之一: tmux会话终止,我注销。没有日志,什么都没有 我明白了: 我尝试了几种基于xar
tar.gz
中。每个零件编号为零件xxx
,以确保我可以恢复原始文件。在解密时,我解压,并行解密每个部分,并按顺序解密结果
有趣的部分:当我在一个足够大的文件上完成最后一部分时,会发生以下情况之一:
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报告一个问题时,我可以转到temp文件夹中的所有部分,自己运行完全相同的命令,一切正常
在重要的情况下,所有这些都发生在安装了RAM的文件系统中。但是RAM不可能是问题所在:我在一台拥有256GB RAM的机器上,涉及的文件占用1-2GB,并且
htop
从未显示超过10%的使用率。您的问题在于:
ls -1 -f part-* | ...
find $OUTPUT.part-* | ...
rm $OUTPUT.part-*
如果您有太多的部分(part-*
,等等),shell执行的文件名扩展将导致命令包含太多参数,或者您可能会超过最大命令长度
find
+xargs
允许您克服这一点。您可以将使用glob列出当前目录中文件的任何命令替换为,例如:
find . -name GLOB -print -o ! -path . -prune | xargs CMD
-o-路径-prune
告诉find
不要下降到子目录中xargs
确保生成的命令行不超过最大参数或行限制
因此,对于这三条线,您可以做到:
globwrap(){
glob=“$1”
转移
查找。-名称“$glob”-打印-o!-路径。-修剪|\
sed's/^../'|\
xargs“$@”#如果未给出命令,则默认为echo
}
globwrap“部分-*”|。。。
全局换行“$OUTPUT”。部分-*”|。。。
全局换行“$OUTPUT”。部分-*”rm
单引号防止shell扩展我们传递给find
的glob
sed
去掉每个文件名前面的/
请注意,在前两种情况下,不再需要原始的
ls
和find
。您有一台安装了256GB RAM的机器,但将未加密的数据以64kB的数据块通过Internet发送出去以进行加密?加密和解密都发生在具有256GB RAM的同一台机器上。没有通过internet发送任何内容。我不确定我是否理解这一点,但您的find
命令是错误的。您需要查找-名称“$OUTPUT.part-*”..
。。。而不是find…|xargs…
您可能希望查找-exec cat{}\;>某些地方
xargs
具有与cat
相同的限制,请参见sysctl-a | grep-i argmax
find . -name GLOB -print -o ! -path . -prune | xargs CMD