linux - 如何加速 grep/awk 命令?

标签 linux performance awk grep

我将处理文本文件 (>300 GB) 并将其拆分为小文本文件 (~1 GB)。我想加快 grep/awk 命令的速度。

我需要对 b 列有值的行进行 grep,这是我的方法:

# method 1:
awk -F',' '$2 ~ /a/ { print }' input

# method 2:
grep -e ".a" < inpuy

这两种方式每个文件都花费 1 分钟。那么我怎样才能加快这个操作呢?


输入文件示例:

a,b,c,d
1,4a337485,2,54
4,2a4645647,4,56
6,5a3489556,3,22
9,,3,12
10,0,34,45
24,4a83944,3,22
45,,435,34

预期输出文件:

a,b,c,d
1,4a337485,2,54
4,2a4645647,4,56
6,5a3489556,3,22
24,4a83944,3,22

最佳答案

How to speed up grep/awk command?

您确定 grepawk 是造成您感知缓慢的罪魁祸首吗?你知道cut(1)吗或 sed(1) ?您是否对运行时间进行了基准测试wc(1)在你的数据上?可能文本 I/O 花费了很多时间。

请进行基准测试几次,并使用time(1)对您的程序进行基准测试。

我有一台高端 Debian 台式机(配备 AMD 2970WX、64Gb RAM、1TB SSD 系统磁盘、多 TB 7200RPM SATA 数据磁盘)并且只是在 25GB 文件上运行 wc(一些*.tar.xz 存档)在硬盘上需要 10 多分钟(用 time 测量),而 wc 正在做一些 < em>非常简单的文本处理,按顺序读取该文件,因此运行速度应该比grep(但令我惊讶的是,事实并非如此!)或 awk相同 数据上:

wc /big/basile/backup.tar.xz  640.14s user 4.58s system 99% cpu 10:49.92 total

和(在同一个文件上使用grep来计算a的出现次数)

grep -c a /big/basile/backup.tar.xz  38.30s user 7.60s system 33% cpu 2:17.06 total

您问题的一般答案:

只需巧妙地(使用高效的O(log n) time complexity data structures : red-black treeshash tables , 等等 ...) C 或 C++ 或 Ocaml 或大多数其他好的语言和实现中的等效程序。或者购买更多 RAM 来增加您的 page cache .或者买一个SSD保存您的数据。并且多次重复您的基准测试(因为页面缓存)。

针对你的问题的建议:使用关系型数据库

很可能使用 300Gb 的纯文本文件不是最好的方法。 拥有巨大的文本文件通常是错误的,而且一旦您需要多次处理相同的数据,就很可能是错误的。你会更好pre-process不知何故..

如果您多次对相同数据文件重复相同 grep 搜索或awk 执行, 考虑改用 sqlite (参见 this 答案)甚至一些other真实relational database (例如使用 PostGreSQL 或其他一些好的 RDBMS)来存储然后处理您的原始数据。

所以一种可能的方法(如果你有足够的磁盘空间)可能是编写一些程序(用 C、Python、Ocaml 等...),由你的原始数据提供,并填充一些 sqlite 数据库。一定要有巧database indexes并花时间设计足够好的database schema ,意识到database normalization .

关于linux - 如何加速 grep/awk 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56334265/

相关文章:

linux - 反向搜索在 Linux 中不起作用

python - 如何保证更少的UDP数据包被丢弃?

ssh - 在对 awk 的 ssh 远程调用中转义感叹号?

python - Django - 导入错误 : No module named city

linux - 使用 CMake 查找 libffi 头文件

python - 在列表中查找排名和百分比排名

javascript - 获取所有数据后如何加载div包含

javascript - 在 AngularJS 中编写 Controller 有哪些不同的方式?

即使杀死所有 java 进程后,java <defunct> 仍然存在

regex - awk - 正则表达式中的变量扩展