gpt4 book ai didi

bash 'while read line' 大文件效率

转载 作者:行者123 更新时间:2023-11-29 09:09:16 25 4
gpt4 key购买 nike

我正在使用 while 循环来处理任务,

从一个大约 1000 万行的大文件中读取记录。

我发现随着时间的推移处理越来越慢。

然后我做了一个100万行的模拟脚本作为blow,它揭示了问题。

但我仍然不知道为什么,read 命令是如何工作的?

seq 1000000 > seq.dat
while read s;
do
if [ `expr $s % 50000` -eq 0 ];then
echo -n $( expr `date +%s` - $A) ' ';
A=`date +%s`;
fi
done < seq.dat

终端输出时间间隔:

98 98 98 98 98 97 98 97 98 101 106 112 121 121 127 132 135 134

在大约 50,000 行时,处理速度明显变慢。

最佳答案

使用您的代码,我看到了相同的增加时间的模式(从一开始就!)。如果你想要更快的处理,你应该使用 shell 内部功能重写。这是我的 bash 版本:

tabChar="   "  # put a real tab char here, of course
seq 1000000 > seq.dat
while read s;
do
if (( ! ( s % 50000 ) )) ;then
echo $s "${tabChar}" $( expr `date +%s` - $A)
A=$(date +%s);
fi
done < seq.dat

编辑修复了错误,输出表明正在处理每一行,现在只有每 50000 行得到计时处理。多哈!

  if ((  s % 50000 )) ;then

固定为

  if (( ! ( s % 50000 ) )) ;then

现在输出 echo ${.sh.version} = Version JM 93t+ 2010-05-24

50000
100000 1
150000 0
200000 1
250000 0
300000 1
350000 0
400000 1
450000 0
500000 1
550000 0
600000 1
650000 0
700000 1
750000 0

输出 bash

50000    480
100000 3
150000 2
200000 3
250000 3
300000 2
350000 3
400000 3
450000 2
500000 2
550000 3
600000 2
650000 2
700000 3
750000 3
800000 2
850000 2
900000 3
950000 2
800000 1
850000 0
900000 1
950000 0
1e+06 1

至于为什么您的原始测试用例要花这么长时间……不确定。我很惊讶地看到每个测试周期的时间和时间的增加。如果您真的需要了解这一点,您可能需要花时间检测更多测试内容。也许您会看到一些东西正在运行 trussstrace(取决于您的基本操作系统)。

希望对您有所帮助。

关于bash 'while read line' 大文件效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com