多次抓狂处于不间断状态

问题描述

所以我大约有30个文件夹,每个文件夹包含〜75个文本文件。它们实际上是从routeviews提取的BGP转储
数据总量总计约为480 GB,现在我必须从中获取IP地址列表。所以我使用普通的grep并遍历IP列表,然后遍历数据集,但这太慢了。
我在使用xargs的grep时遇到了这个SO post,并且效果很好。我对结果进行计时,普通grep约为7秒,// 1个文件夹的grep约为1.5秒(一次使用24个实例)
现在的问题是,当我在IP列表和数据集的嵌套循环中执行此操作时,它对于启动文件夹非常有效,但最终在uninterruptible state中出现了多次混乱,我不知道为什么...
我用于grep的命令是-
find ./ -name "rib.${YYMM}${DATE}.${TIME}*" -print0 | xargs -0 -n1 -P24 grep ${prefix} | wc -l >> ${TIME}
其中${YYMM}${DATE}${TIME}是用来标识文件的,而${prefix}是要被grepped的前缀的可迭代变量。
示例文件命名约定-

rib.20191201.0200_chicago
肋.20191230.2000_chile
rib.20191215.1400_syyney

Here is the screenshot of htop


规格:我正在使用具有20个v-cpu和50 GB RAM的Ubuntu 16.04.2服务器,根据htop的说明,它们绝对不会过载。
有什么解决方法吗?
由于我拥有庞大的IP列表,所以即使是1秒,从长远来看也有很大的不同

解决方法

好的,我终于找到了出路!
我编写了一个bash脚本,将整个480GB数据库上传到mongoDB。
这会花费大量时间,但是从长远来看,当我有很多要搜索的前缀时,这对我很有帮助。我根据prefixes和景气为它建立了索引!
现在,我可以在不到 200毫秒
的范围内搜索前缀 传统grep中 7秒
&〜在带有xargs的grep中 1.5秒
编写了另一个Shell脚本以循环前缀,并将天的计算结果转换为分钟数
示例代码:
要上传:
mongoimport -d DB_name -c C_name --type csv --file "F_name" --headerline
索引:
mongo --quiet --eval "db.getCollection('C_name').createIndex({PREFIX:1});" DB_name
搜索:
mongo --quiet --eval "db.getCollection('C_name').find({ PREFIX: '117.193.0.0/20' }).count();" DB_name