我正在使用 awk 处理一个巨大的数据文件(大约 1 亿行)。
这就是我的表情——
tac <myfile> | awk -F',' 'OFS=\",\" {if(/^#/){print;}else{\$1=tolower(\$1);if(!seen[\$1]++)print;}}'|")
但是,我发现 awk 存在内存泄漏。有人可以指出这里的内存占用吗?
谢谢!
答案1
我相信,根据您提供的行数,您可能正在交换......
下面的 perl 脚本使用磁盘中的 B 树(这在数据库中很常见)作为数组 - 我们几乎不使用 RAM 内存。
$ cat remdup
#!/usr/bin/perl
use DB_File;
tie %seen, 'DB_File', "mydbfile.db", O_RDWR|O_CREAT|O_TRUNC ,0666, $DB_BTREE;
while(<>){
if(/^#/) { print; }
elsif(/(.*?),/) { $a=lc($1);
print if( ! $seen{$a}++)}
}
无论如何,这将需要很长时间来处理(在我的 5 年旧笔记本电脑中处理 100 万行需要 16 秒)
用法:tac file | perl remdup > output
编辑:如果您运行任何解决方案,请告诉我们时间。