【发布时间】:2021-10-26 10:24:07
【问题描述】:
我想在一个很长的字符串上执行一个任务,我认为我需要单独对每个字符进行操作。在这样做之前,我首先尝试建立访问所有这些字符所需时间量的基线。
我打算使用的输入是一个文本文件,其中一行包含一个单词,由数字组成。
下面的代码是我目前为止最好的尝试,有没有更快的方法来逐个访问字符串中的所有字符?
function handle_split() {
split=$1
while read -N 1 char; do
:
done
}
while read -N 100000 split; do
((i=i%100)); ((i++==0)) && wait
handle_split $split &
done < "filename.txt"
此行旨在避免同时排队超过 100 个任务
((i=i%100)); ((i++==0)) && wait
拆分的长度是根据输入的已知长度硬编码的,在这种情况下,我使用的是大约十亿个字符的字符串。
顺便说一句,我尝试将我的字符串拆分转换为数组以提高性能。
function handle_split() {
split=($@)
for char in ${split[@]}; do
:
done
}
while read -N 100 split; do
arr=($(echo $split | grep -o .))
((i=i%100)); ((i++==0)) && wait
handle_split "${arr[@]}" &
done < "filename.txt"
但是这种使用数组的实现甚至比简单的 for 循环还要慢。
while read -N 1 char; do
:
done < "filename.txt"
【问题讨论】:
-
在您的情况下,Shell 循环将是一场灾难。它们不适用于那么多迭代。如果您稍微解释一下您对每个字符的处理方式,我们可能可以使用
sed、awk、python、perl或其他方式提出更有效的方法。例如,它可以制成表格吗?我的意思是,如果你的字符是数字,而你只是想将它们转换成另一个字符集,tr可能就是你需要的。 -
我正在尝试将“15487355732..”之类的输入排序为“111222333..”之类的内容,虽然我可以通过排序来做到这一点,但我认为可以通过创建一个更快地完成每个数字出现次数的哈希图,处理过程是将存储在适当键中的值加 1,可能会将每个任务的结果转储到单独的文件中。
-
另外,我知道循环方法不是最好的,我只是想确保我尝试了它的最佳实现,所以我可以说“所以,这是最好的这可以通过循环来完成,但还不够好,所以任何使用循环的东西都可以被丢弃”。
-
您可以以任何可能的方式组织事物,使用 shell 命令处理数十亿位数字将花费大量时间。找出哪种实现的灾难性较小仅具有理论上的意义。
标签: string bash loops text text-files