나는 거대한 데이터 파일(약 1억 라인)을 처리하기 위해 awk를 사용하고 있습니다.
내 표현은 이렇다 -
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
편집: 솔루션을 실행하는 경우 언제 실행하는지 알려주세요.