如何在shell脚本中的while循环中优化从大文件读取的操作

时间:2018-08-28 09:51:13

标签: linux shell scripting

我在互联网上浏览了一些随机文章,内容涉及如何优化循环中的文件输入并尝试自己进行测试。他们声称,在大多数情况下,对文件描述符的操作比直接从文件读取到循环中可以更快更有效。我尝试这样做:

首先从文件中直接读入循环:

time while read a ; do :;done < testfile

此命令花费的时间是:

real 0m8.782s
user 0m1.292s
sys  0m0.399s

现在,我尝试做一些文件描述符操作,就像这篇文章中建议的那样:

  1. 我首先将文件描述符0重定向到文件描述符3,例如:exec 3<&0
  2. 然后我将测试文件重定向到文件描述符0:exec 0 < testfile
  3. 在循环结束时,我将数据读取为0<&3,这意味着将文件描述符3重定向到0。因此,完整的行如下所示:

    exec 3<&0;exec 0<testfile; time for i in $(seq 1 20);do while read a; do :;done; done; exec 0<&3
    

这给了我一段时间:

     real 0m8.792s
     user 0m1.258s
     sys  0m0.430s

但是我发现两种情况下的时间几乎相同,实际上,当我使用文件描述符时,速度稍慢一些。文件testfile6MB,几乎有400k行,每行最多包含20-25个字符。

实际上,对于更大的文件,从文件中直接读取实际上比文件描述符操作要快。

1 个答案:

答案 0 :(得分:0)

使用C。这是最快的速度,而且如果您真的关心速度的话。

您可以从输入流向function onFormSubmit11(e) { var range = e.range; var ss = range.getSheet(); var row = range.getRowIndex(); ss.getRange("AN"+row).clear(); ss.getRange("AO"+row).clear(); ss.getRange("AP"+row).clear() ss.getRange("AQ"+row).clear() } 编写自己的程序,然后在每一行调用getline()。由于进行了systemfork()调用,这可能会比较慢,但是如果可以将行操作放入C代码中,则可能会更快。
您可以编写自己的内置shell。 Shell exec()构建仅调用read,浏览bash here。您可以编写自己的shell内置程序,比默认的read()内置程序更快地通过输入循环命令。像read

为了使您的帖子可重现,我创建了一个大文件:

my_read_bultin 'file' -- 'command to run on each line'

然后运行:

$ for ((i=0;i<1200000;++i)); do echo ${RANDOM}; done >/tmp/1
$ du -hs /tmp/1
6.5M    /tmp/1