큰 단어 목록에서 중복을 삭제하는 가장 빠른 방법은 무엇입니까?


14

큰 단어 목록을 중복 제거해야합니다. 나는 몇 가지 명령을 시도하고 여기여기 에서 단어 목록을 중복 제거하는 가장 빠른 방법이 awk를 사용하는 것으로 설명하는 곳에서 조사 했습니다 .

awk-> O (n)? sort-> O (n log n)?

그러나 이것이 사실이 아닌 것으로 나타났습니다. 내 테스트 결과는 다음과 같습니다.

sort -u input.txt -o output.txt 

실제 0m12.446s
사용자 0m11.347s
시스템 0m0.906s

awk '!x[$0]++' input.txt > output.txt

실제 0m47.221s
사용자 0m45.419s
sys 0m1.260s

따라서 sort -u를 사용하면 3.7 배 더 빠릅니다. 왜 이런거야? 중복 제거를 수행하는 더 빠른 방법이 있습니까?

*********** 업데이트 ********

누군가가 의견에서 지적했듯이 내 단어 목록이 이미 어느 정도 정렬되어있을 수 있습니다. 이 가능성을 배제하기 위해이 파이썬 스크립트를 사용하여 두 개의 단어 목록을 생성했습니다 .

List1 = 7 Mb
List2 = 690 Mb

결과 AWK :
List1
실제 0m1.643s
사용자 0m1.565s
sys 0m0.062s

List2
실제 2m6.918s
사용자 2m4.499s
sys 0m1.345s

결과 SORT :
List1
실제 0m0.724s
사용자 0m0.666s
sys 0m0.048s

List2
실제 1m27.254s
사용자 1m25.013s
sys 0m1.251s


입력 데이터가 이미 정렬되었을 수 있습니까?
iruvar

나는 숫자로 임의의 목록을 생성하고 확인하기 위해 확인합니다
karlpy

2
Big O 표기법은 입력 길이가 무한대에 도달 할 때 발생하는 작업에 대한 것입니다. 입력이 큰 알고리즘에 따라 크기가 커집니다. 일부 알고리즘은 작은 입력 크기에서 더 잘 작동합니다.
ctrl-alt-delor

1
칼피, 어떤 순서로 처형 했어? 파일 캐싱으로 인해 차이가 생길 수 있습니다
iruvar

1
@karlpy : "파일 이름을 변경했습니다 ..."파일 이름을 변경했다면 충분하지 않습니다. 파일 이름을 바꾸면 새 이름이 이전 inode와 연결되어 여전히 동일한 이전 데이터 블록을 가리 킵니다. 캐시 된 경우 여전히 캐시됩니다. ISTM은 (1) 파일의 사본을 만든 다음 (2) 한 파일에서 하나의 명령을 실행하고 (3) 다른 파일에서 다른 명령을 실행하는 것이 훨씬 더 나은 기술이라는 것이 ISTM입니다 .
Scott

답변:


3

당신은 잘못된 질문을하거나, 잘못하고 잘못된 스택에 질문을하고, 이것은 사람들이 awk 및 정렬 내부에서 사용되는 알고리즘을 기반으로 답변을 줄 수 있도록 프로그래밍 / 스택 오버플로에서 묻는 더 좋은 질문입니다.

추신 : 또한 nawk, mawk 및 gawk를 사용하여 "영역으로"에 대한 자세한 내용을 제공하고 최소, 최대, 평균 및 표준 편차를 사용하여 100 번처럼 실행합니다.

CompSci 210에서 당면한 질문으로 돌아가는 모든 경우는 사용 된 알고리즘에 관한 것입니다. 정렬은 크기에 따라 여러 가지를 사용하며, 메모리가 부족한 경우 병합을 위해 파일을 임시 파일로 디스크에 저장하기 위해 발생하는 메모리 제약 조건을 사용하므로 소스 코드를 살펴보아야합니다. specific sort (1) 명령은 실행중인 특정 OS에서 사용하지만 경험상 가능한 한 빨리 메모리에로드하고 빠르게 정렬하고 디스크에 쓰고 반복 헹구고 마지막으로 작은 정렬 파일을 병합 정렬합니다. 따라서 여기에는 부품에 대한 O (n * log2 (N))이 있고 대략 O (n * log (n)) 병합 작업이 있습니다.

awk : x [$ 0] ++ 메커니즘은 해싱을 사용하기 위해 "제공"입니다. 그러나 O (1) "조회"연산 인 해싱과 관련된 문제는 충돌과 충돌 처리입니다. 이것은 데이터가 잘 퍼지지 않거나 버킷을 채우지 않을 때 문제를 일으킬 수 있으며 큰 목록에서 충돌 처리가 올바르게 수행되지 않으면 해싱이 큰 메모리 문제가 될 수 있습니다 (및 예상 데이터에 대한 해싱 알고리즘을 조정 한 다음 실제 해싱 함수의 성능을 살펴보고 O (1)이 삽입물 (즉, O)에 대해 O (log (n))에 더 가깝습니다. (1) 첫 번째 검색의 경우 존재하지 않는 경우 O (log (n)) 일 수있는 것을 추가하면 n * O (1)은 ** (log (n)) =가됩니다. > O (n * log (n)), "해석 된"방식으로 일을하고 있다는 것은 말할 것도 없습니다. :)


-2

속도 차이는 '정렬'이 명령 ( link )이고 'awk'가 프로그래밍 언어 ( link ) 이기 때문 입니다.

'정렬'명령은 입력을 받고 출력을 반환합니다. 'awk'는 프로그래밍 언어이며, 먼저 코드 (터미널 명령)를 해석 한 다음 처리를 시작합니다. 그렇게 간단합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.