如何获取大型文本数据文件的统计信息

Posted

技术标签:

【中文标题】如何获取大型文本数据文件的统计信息【英文标题】:How to get statistics on a large text file of data 【发布时间】:2015-07-22 12:42:04 【问题描述】:

我有一组大型(~100,000,000 行)文本文件,格式如下:

    0.088293 1.3218e-32 2.886e-07 2.378e-02        21617        28702
    0.111662 1.1543e-32 3.649e-07 1.942e-02        93804        95906
    0.137970 1.2489e-32 4.509e-07 1.917e-02        89732        99938
    0.149389 8.0725e-32 4.882e-07 2.039e-02        71615        69733
    ...

我想找出第 2 列的平均值和总和,以及第 3 列和第 4 列的最大值和最小值,以及总行数。如何使用 NumPy 有效地做到这一点?由于它们的大小,loadtxtgenfromtxt 不好(需要很长时间才能执行),因为它们试图将整个文件读入内存。相比之下,像awk这样的Unix工具:

awk ' total += $2  END  print total/NR ' <filename>

在合理的时间内工作。 Python/NumPy 可以为这么大的文件完成awk 的工作吗?

【问题讨论】:

所以你只是在寻找一个 numpy 的答案?这个技术我不知道,但是awk可以做的很好 我愿意接受awk 的回答,如果我可以在文件的一次传递中获得其他统计信息。我不太了解awk 那么它也将有助于显示所需的输出应该是什么样子 我不太担心精确的输出格式:单行上的空格分隔值或单独行上的 &lt;key&gt; = &lt;val&gt; 对都可以。 【参考方案1】:

你可以这样说:

awk '  total2 += $2
        for (i=2;i<=3;i++) 
            max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i
            min[i]=(length(min[i]) && min[i]<$i)?min[i]:$i
        
      END 
           print "items", "average2", "min2", "min3", "max2", "max3"
           print NR, total2/NR, min[2], min[3], max[2], max[3]
     ' file

测试

根据您给定的输入:

$ awk 'total2 += $2; for (i=2;i<=3;i++) max[i]=(length(max[i]) && max[i]>$i)?max[i]:$i; min[i]=((length(min[i]) && min[i]<$i)?min[i]:$i) END print "items", "average2", "min2", "min3", "max2", "max3"; print NR, total2/NR, min[2], min[3], max[2], max[3]' a | column -t
items  average2     min2        min3       max2        max3
4      2.94938e-32  1.1543e-32  2.886e-07  8.0725e-32  4.882e-07

【讨论】:

可能想要检查 max[i] 包含的数据是否为 ​​0,然后它将任何负数计为更大。 没错,虽然我已经在做max[i]=(max[i] &amp;&amp; max[i]&gt;$i)?max[i]:$i。还不够吗? 不,假设一行有 -1,现在是 max[i],下一行是零,max[i] 现在是 0,现在如果下一行除了 null,"",0 之外还有其他内容将被设置为最大值,因为max[i] 将失败,因此&amp;&amp; max[i]&gt;$i 将不会被执行,默认设置为将 $i 设置为最大值。 @User112638726 现在我明白了,好一个!所以说max[i]=(length(max[i])&gt;0 &amp;&amp; max[i]&gt;$i)?max[i]:$i应该是固定的,对吧? 是的,应该这样做!真的不需要检查它是否大于 0,因为如果它是空的,它将是 false/0,尽管我想它确实使它更容易阅读:) 而且它也会导致与 min 相同的问题,但是相反的方式。【参考方案2】:

遍历这些行并应用正则表达式来提取您要查找的数据,并将其添加到您想要的每一列的初始空列表中。

获得列表形式的列后,您可以将 max(list) min(list) avg(list) 函数应用于数据以获得您感兴趣的任何计算。

注意:您可能需要修改将数据添加到列表的位置,并将数字从 str 转换为 int 形式,以便 max、min、avg 函数可以对它们进行操作。

【讨论】:

最好在他遍历每一行的时候计算统计;这样他就不需要建立列表了。

以上是关于如何获取大型文本数据文件的统计信息的主要内容,如果未能解决你的问题,请参考以下文章

如何提高大型文本文件的数据加载性能[重复]

有没有办法在大型机上使用 python 脚本发送 ISPF 命令并获取作业统计信息?

MapReduce编程实战之“高级特性”

如何使用BS4从标签外部提取文本

linux文本如何统计列数

在网站上显示大型 Excel 文件中的数据的最佳方式