我正面临一个问题,在AIX平台上,我们使用命令生成校验和:
样品:
exec 0<list
while read line
do
openssl md5 $line >> checksum.out
done
但这持续了很长时间。我发现我们的cpus仍有免费资源。 它是运行多线程的openssl md5吗?如果不是,我怎么能让它通过多线程运行,或使用其他方法来加速它。
最好的问候
空隙
答案 0 :(得分:0)
如果我从this question的答案和评论中正确理解,那么就无法完成,因为散列算法中的步骤之间存在依赖关系(我想OpenSSL一般会有多线程实现可能的)。
但是,您始终可以通过并行启动openssl md5
的 n 实例来并行化任务。
例如(假设 n = 4个主题)
while read line; do
openssl md5 $line >> checksum.out0 &
openssl md5 $(read) >> checksum.out1 &
openssl md5 $(read) >> checksum.out2 &
openssl md5 $(read) >> checksum.out3
done
如果要保持同时运行的确切线程数,则最后一个不应在后台运行。此外,您可能希望确保不同的行需要大约相同的时间才能完成,因此您不会最终遇到竞争条件。
此示例并未经过实际测试(使用$(read)
),并且可能有更好的方法(例如,让每个实例将其输出写入单独的文件,然后将它们连接起来 - 例如{ {1}}),但它应该足以帮助你开始。
<强> 编辑: 强>
我刚刚测试过并且cat checksum.out* > checksum.out
按照我希望的方式工作,所以通过为每个read
实例创建一个新的输出文件,并在末尾增加数字(例如通过包含一个计数器变量),你可以添加脚本末尾的额外行,用于将输出捕获到单个文件中。
结果脚本:
openssl md5
应该做的伎俩(记得事后清理所有的临时文件......)