如何获取大型文本数据文件的统计信息
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 有效地做到这一点?由于它们的大小,loadtxt
和genfromtxt
不好(需要很长时间才能执行),因为它们试图将整个文件读入内存。相比之下,像awk
这样的Unix工具:
awk ' total += $2 END print total/NR ' <filename>
在合理的时间内工作。
Python/NumPy 可以为这么大的文件完成awk
的工作吗?
【问题讨论】:
所以你只是在寻找一个 numpy 的答案?这个技术我不知道,但是awk
可以做的很好
我愿意接受awk
的回答,如果我可以在文件的一次传递中获得其他统计信息。我不太了解awk
。
那么它也将有助于显示所需的输出应该是什么样子
我不太担心精确的输出格式:单行上的空格分隔值或单独行上的 <key> = <val>
对都可以。
【参考方案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] && max[i]>$i)?max[i]:$i
。还不够吗?
不,假设一行有 -1,现在是 max[i]
,下一行是零,max[i]
现在是 0,现在如果下一行除了 null,"",0
之外还有其他内容将被设置为最大值,因为max[i]
将失败,因此&& max[i]>$i
将不会被执行,默认设置为将 $i 设置为最大值。
@User112638726 现在我明白了,好一个!所以说max[i]=(length(max[i])>0 && max[i]>$i)?max[i]:$i
应该是固定的,对吧?
是的,应该这样做!真的不需要检查它是否大于 0,因为如果它是空的,它将是 false/0
,尽管我想它确实使它更容易阅读:) 而且它也会导致与 min 相同的问题,但是相反的方式。【参考方案2】:
遍历这些行并应用正则表达式来提取您要查找的数据,并将其添加到您想要的每一列的初始空列表中。
获得列表形式的列后,您可以将 max(list) min(list) avg(list) 函数应用于数据以获得您感兴趣的任何计算。
注意:您可能需要修改将数据添加到列表的位置,并将数字从 str 转换为 int 形式,以便 max、min、avg 函数可以对它们进行操作。
【讨论】:
最好在他遍历每一行的时候计算统计;这样他就不需要建立列表了。以上是关于如何获取大型文本数据文件的统计信息的主要内容,如果未能解决你的问题,请参考以下文章