用存储在另一个文件中的320K模式填充1M行文件



我试图将一个1M行'|'分隔的320K模式文件从另一个文件中用管道传输到Ole Tange的并行包,并将匹配的结果管道传输到另一个文件夹中。我在Windows7上使用Cygwin,有24个内核和16GB物理内存。

通过此链接后我使用的命令填充一个巨大的文件(80GB)有什么方法可以加快速度吗?

< 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" > testxaa

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

我的nov15.DAT模式文件由诸如"A12345M"之类的字符串和此模式需要匹配的文件组成,即matchReport1.DAT具有诸如"A12345 M_dfdf"one_answers"A12345M_02"这样的字符串,因此不能在grep中使用-F选项。除了使用数据库之外,有人能提出一个修复方案或任何其他选择吗?

这是的样本

2014年11月15日->http://pastebin.com/raw/cUeGcYLb

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

我假设您只想将nov15.DAT中的字符串和matchReport1.dat中第二列的开头进行比较。

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

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

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

不是很准确,但如果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 

最新更新