有哪些选项可以统计超大文件的字数?
我相信整个文件都在 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/