【问题标题】:Grepping a 1M row file with 320K patterns stored in another fileGrepping 一个 1M 行文件,其中 320K 模式存储在另一个文件中
【发布时间】:2016-01-06 00:53:30
【问题描述】:

我试图 grep 1M 行 '|'将具有 320K 模式的文件从另一个文件中分离出来,并通过管道连接到 Ole Tange 的并行包,并将匹配的结果通过管道传输到另一个文件中。我在具有 24 核和 16GB 物理内存的 Windows 7 上使用 Cygwin。

通过此链接后我使用的命令 Grepping a huge file (80GB) any way to speed it up?

< matchReport1.dat parallel --pipe --block 2M LC_ALL=C grep --file=nov15.DAT > test.match

其中 matchReport1.dat 是 1M 行 '|'分离文件和 320K 模式存储在 nov15.DAT 中。任务管理器活动达到所有 24 个核心,物理内存使用量跃升至 ~15GB,我开始收到 grep 内存已用尽的消息。

然后我尝试将 nov15.DAT 模式文件拆分为 10 个较小的块并运行 grep

parallel --bar -j0 -a xaa "LC_ALL=C grep {} matchReport1.dat" &gt; testxaa

但这需要的时间太长(30K 行中只有 1.6K 行 grepping 花了大约 15 分钟)。

我的 nov15.DAT 模式文件包含像“A12345M”这样的字符串,并且该模式需要匹配的文件,即 matchReport1.dat 有像“A12345M_dfdf”和“A12345M_02”这样的字符串,因此不能在 grep 中使用 -F 选项。除了使用数据库之外,有人可以建议修复或任何其他选项吗?

这是一个示例

nov15.DAT -> http://pastebin.com/raw/cUeGcYLb

matchReport1.dat -> http://pastebin.com/raw/01KSGN6k

【问题讨论】:

标签: bash grep cygwin gnu-parallel


【解决方案1】:

我假设您只想比较来自nov15.DAT 的字符串与来自matchReport1.dat 的第二列的开头。

试试这个:修改nov15.DAT以避免在每一行中从第一个字符到最后一个字符进行比较:

sed 's/.*/^"[^|]*"|"&/' nov15.DAT > mov15_mod1.DAT

然后在您的并行命令中使用mov15_mod1.DAT

【讨论】:

  • 我理解你提出的模组。根据您在上面发布的 gnu 并行链接,我会尽快返回性能统计信息。
【解决方案2】:

不是很准确,但是如果 nov15 中的 ID 是唯一的并且与该行中的其他位置不匹配,那么这可能会起作用。而且速度很快:

perl -F'\|' -ane 'BEGIN{chomp(@nov15=`cat nov15.DAT`);@m{@nov15}=1..$#nov15+1;} for $l (split/"|_/,$F[1]) { if($m{$l}) { print }}' matchReport1.dat 

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多