如何获取大型文本数据文件的统计信息
How to get statistics on a large text file of data
我收集了大量(约 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 += } END { print total/NR }' <filename>
在合理的时间内工作。
Python/NumPy 可以为这么大的文件做 awk
的工作吗?
遍历行并应用正则表达式来提取您要查找的数据,将其添加到您想要的每一列的初始空列表中。
一旦您拥有列表形式的列,您就可以将 max(list) min(list) avg(list) 函数应用于数据以获得您感兴趣的任何计算。
注意:您可能需要修改将数据添加到列表的位置,并将数字从 str 转换为 int 形式,以便 max、min、avg 函数可以对其进行运算。
你可以这样说:
awk '{ total2 +=
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 += ; 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
我收集了大量(约 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
:
awk '{ total += } END { print total/NR }' <filename>
在合理的时间内工作。
Python/NumPy 可以为这么大的文件做 awk
的工作吗?
遍历行并应用正则表达式来提取您要查找的数据,将其添加到您想要的每一列的初始空列表中。
一旦您拥有列表形式的列,您就可以将 max(list) min(list) avg(list) 函数应用于数据以获得您感兴趣的任何计算。
注意:您可能需要修改将数据添加到列表的位置,并将数字从 str 转换为 int 形式,以便 max、min、avg 函数可以对其进行运算。
你可以这样说:
awk '{ total2 +=
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 += ; 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