gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:41:04 25 4
gpt4 key购买 nike

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

我相信整个文件都在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com