【发布时间】:2022-01-06 15:10:15
【问题描述】:
寻找一种从 Linux 服务器上的大型数据集中获取前 3 个(可扩展)数字字段的有效方法;这是后续https://stackoverflow.com/a/70117001/8823709 的最佳建议
“我有一个 awk 数组,用于聚合和下载字节。我可以 按字节向下或向上对输出进行排序,然后通过管道传送到 谈话最多的人;是否可以使用不同的输出两种类型 钥匙?”
曾经:
zgrep '^1' 20211014T00*.gz|
awk '
NR > 1 {
key = $1 " " $2
bytesdown[key] += $3
bytesup[key] += $4
}
END {
cmd = "sort -rn | head -3"
for ( key in bytesDown ) {
print bytesDown[key], bytesUp[key], key | cmd
}
close(cmd)
cmd = "sort -rnk2 | head -3"
for ( key in bytesDown ) {
print bytesDown[key], bytesUp[key], key | cmd
}
close(cmd)
}
'
但是,由于数据集的范围可以从 1000 行到数百万行,而不是将整个集合读入一个数组,排序并丢弃绝大多数,将前 10 位的数组作为数据来维护是否可行被读入了吗?与内存消耗相比,绝对速度不是问题,内存消耗是服务器上相对有限的资源。
例如,给定以下示例输入:
ip1 fqdn101 101 10
ip2 fqdn102 102 11
ip3 fqdn103 103 12
ip4 fqdn104 104 13
ip1 fqdn101 105 14
ip1 fqdn102 106 15
ip1 fqdn103 107 16
ip1 fqdn104 108 17
ip2 fqdn103 109 16
ip2 fqdn104 110 17
应该输出
ip1 fqdn101 206 24
ip2 fqdn104 110 17
ip2 fqdn103 109 16
和
ip1 fqdn101 206 24
ip2 fqdn104 110 17
ip1 fqdn104 108 17
对 awk 以外的选项开放——尽管这将是我的默认起点——只要它们在我获得的企业 Linux 服务器版本上可用...
【问题讨论】:
-
日志可以转到数据库而不是平面文件吗?
-
他们有,但由于政治原因,我无权访问该数据库。我的团队并行存储了 5TB 的压缩日志,这对于抽查来说很好,但意味着需要对更大规模的工作进行分块和聚合。大多数数据都有一条长尾,通常很少/没有兴趣,因此需要高效的 top N 机制。
-
您能否将平面文件放入您自己的数据库中以避免您的经理应该知道的政治阻碍您的工作?
-
TBH,我没有要求数据库。日志文件的副本需要保持原样,因此数据库需要更强大的服务器和另外 5TB 以上的磁盘。并非不可能,也并非没有重大开销,但作为一种选择。
-
由于您的文件未排序并且您在运行中添加到您的计数器中,我看不出如何避免跟踪所有
$1 $2键。事实上,如果在某一时刻,您丢弃了一个计数为CNT的条目ipN fqdnXXX,但您的巨型文件的最后一行将 100 添加到CNT并使其再次成为最重要的键之一,您将错过它。您的数据集是否还有另一个您忘记提及的特征可以解决这个问题?