grep 在通过 gig 大小的文件操作时因过多的内存使用而崩溃

grep 在通过 gig 大小的文件操作时因过多的内存使用而崩溃

我有一个 grep 命令

grep -Fvf cleaned1 cleanedR > cleaned2

运行并杀死我的电脑太多内存使用

  • cleanR 是一个文件列表(其中有 1400 万个),我需要通过(dowork.sh cleanR)运行一些操作,已完成的所有内容都打印到 clean1 中(以不同的排序顺序,因此 diff 不起作用)
  • clean1 是文件列表(1000 万)
  • 我不得不取消 dowork.sh 操作,去做其他事情,但我可以稍后通过另一个列表恢复它(dowork.sh clean2)。 clean2 尚不存在
  • clean2 将是一个包含 400 万个文件的列表,我还没有运行 dowork.sh 。
  • 本质上我需要做这个数学运算(它是一个减法运算):列表已清理的文件R - 已清理的文件列表1 =已清理的文件列表2

clean1和cleanedR是包含绝对文件结构的文件,有数百万个文件,这些都是大文件。 clean1 为 1.3G,cleanedR 为 1.5G。

我有大约 30 G 的可用内存,但它用完了所有内存并崩溃了

我在想为什么 grep 在此使用 ram,我可以让 ram 使用其他临时目录吗? Sort 有 -T 选项。所以我正在为 grep 寻找类似的方法。

我对其他想法持开放态度。

-f 运行 cleaned1,其中包含数百万个表达式(文件名),而不是字符串正则表达式。每行 1 个文件 -F 对该行进行完全匹配。文件名可能很复杂,grep 可能会将某些字符误认为正则表达式字符,我们不希望这样,因此我们进行全行匹配。-v 是减法/排除操作

答案1

首先,假设 的行cleaned1必须与 中的整行匹配cleanedR,您可能会从使用 中受益grep -x

出于同样的假设,如果您可以设法对两个大文件cleaned1和进行排序cleanedR,则可以grepcomm -1 -3 cleaned1 cleanedRwhich 替换,速度会相当快。

否则,您可以拆分cleaned1(例如split -l 100000)并按块进行操作。您甚至可以链接这些 grep(即grep -Fvxf chunk1 cleanedR | grep -Fvxf chunk2 | ... > cleaned2),从而在多个 CPU 上并行化。

相关内容