grep - 计算非常大文件中的单词出现次数(运行时内存耗尽) grep -o foo | wc -l

标签 grep large-files word-count

有哪些选项可以统计超大文件的字数?

我相信整个文件都在 1 行上,这可能是下面一个答案中指出的问题的一部分。

在这种情况下,我有一个 1.7 Gb 的 xml 文件,并试图快速计算其中的一些内容。

我找到了这篇文章 Count number of occurrences of a pattern in a file (even on same line) 并且这种方法对我来说适用于一定规模。

最多 300Mb 左右(40 000 次)就可以了

cat file.xml | grep -o xmltag | wc -l    

但超过这个大小,我就会“内存耗尽”。

最佳答案

http://lists.gnu.org/archive/html/parallel/2014-07/msg00009.html

示例:为 m 个正则表达式搜索 n 行。

grep 大量正则表达式的大文件的最简单解决方案是:

grep -f regexps.txt bigfile

或者如果正则表达式是固定字符串:

grep -F -f regexps.txt bigfile

有两个限制因素:CPU 和磁盘 I/O。 CPU很容易 措施:如果 grep 占用 >90% CPU(例如,当运行 top 时),则 CPU 是一个限制因素,并行化会加快速度。如果 不是,那么磁盘 I/O 是限制因素,并且取决于磁盘 系统并行化可能更快或更慢。唯一知道的方法 肯定是要衡量。

如果 CPU 是限制因素,则应该对正则表达式进行并行化:

cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile

这将为每个 CPU 启动一个 grep 并为每个 CPU 读取一次大文件, 但因为这是并行完成的,所以除了第一个之外的所有读取都将是 缓存在RAM中。根据 regexp.txt 的大小,它可能会更快 使用 --block 10m 而不是 -L1000。如果 regexp.txt 太大而不适合 RAM,删除--round-robin 并调整-L1000。这将导致大文件 阅读更多次。

一些存储系统在读取多个 block 时表现更好 平行。这对于某些 RAID 系统和某些网络文件是正确的 系统。并行读取大文件:

parallel --pipepart --block 100M -a bigfile grep -f regexp.txt

这会将大文件分成 100MB 的 block 并在每个 block 上运行 grep 这些 block 。并行读取 bigfile 和 regexp.txt 使用 --fifo 将两者结合起来:

parallel --pipepart --block 100M -a bigfile --fifo cat regexp.txt \| parallel --pipe -L1000 --round-robin grep -f - {}

关于grep - 计算非常大文件中的单词出现次数(运行时内存耗尽) grep -o foo | wc -l,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24670760/

相关文章:

regex - R从字符串中删除非字母数字符号

python - 如何拆分大型文本文件中的组合列表?

c++ - 在 C++ 中有效地读取大型 txt

python - 连接没有顶行的大文件 - python 或 bash?

linux - 使用 grep/linux/bash 计算重复字符串的重叠出现次数

linux - 将 awk 输出作为输入传递给另一个脚本

c# - 根据字数过滤字符串

ruby - 字数统计( ruby )

compilation - 找不到 org.apache.hadoop.classification.InterfaceAudience 的 Cloudera Hadoop 类文件

linux - sed 替换为十六进制