초당 9 억 라인을 계산하는 방법


2

나는 항상 wc-l 명령을 사용하여 줄 수를 계산합니다. 그러나 내 파일 (900 밀)이 크면 결과를 보려면 5 분 이상 기다려야합니다. 더 나은 아이디어가 있습니까?

unix 

정확한 사용 사례는 무엇입니까?
scravy

3
라인 계산은 선형 시간 작업이므로 더 빠른 알고리즘 트릭을 보지 못합니다. 어쩌면 파일을 여러 개의 덩어리로 나누고 스레드하는 도구를 직접 만들 수도 있지만 다시는 이미 그 일을 할 wc -l수 있습니다.
zneak

wc-l이 어떻게 작동하는지 말하기는 어렵습니다. 소스가 거기에 있다고 상상할 것입니다 ... 그러나 모든 문자를 세어 새로운 줄 문자와 비교하면 비효율적입니다. 이 경우 데이터 세트에 대해 더 많이 알고 있다면 속일 수 있습니다. 줄의 길이가 모두 같거나 가까이 있으면 청크의 모든 n 바이트 만 줄 바꿈을 확인할 수 있고 그렇지 않은 경우 새 n 줄을 찾아 다음 n 바이트를 걷습니다. 그런 다음 바이트 수가 적은 바이트를 확인합니다

2
병목 현상은 파일이 모두 RAM에 캐시되어 있지 않으면 계산을 수행하는 코드가 아닌 디스크 I / O입니다.
Barmar

더 많은 답변이있는 거의 동일한 질문에 대해서는 stackoverflow.com/questions/12716570/count-lines-in-large-files 를 참조하십시오 .
야콥

답변:


3

이론적으로 첫 번째 N 줄 (여기서 N은 실험으로 결정한 숫자)을 취하고 길이를 평균 한 다음 파일 크기를 평균 길이로 나눌 수 있습니다. 이렇게하면 실제 줄 수에 대해 매우 정확한 근사치 (보다 정확하지만 N이 높을수록 느려짐)를 얻을 수 있습니다.


니스, 우리가 같은 줄을 따라 생각하고

선 길이가 정규 분포에 적합하다고 가정하면 (정확한 가정이 아닐 수도 있음) 가정하면 ~ 1500 개의 선을 취하면 해당 선의 평균 길이가 실제 평균 길이를 나타낼 확률이 95 %입니다. ~ 1500은 통계적으로 유효한 샘플을 구성합니다. 따라서 (filesize / mean 레코드 길이)를 나누면 꽤 좋은 추정치가됩니다. 이것은 wc -l보다 더 많은 문제입니다. 실제 문제는 wc -l이 I / O에 바인딩되어 있고 15000rpm SATA 드라이브 또는 정말 좋은 SAN의 경우에도 경과 시간의 ~ 99 %가 I / O 대기가된다는 것입니다.
jim mcnamara

SSD가 더 나을 것이라고 상상할 수 있습니까? 어떤 성능을 기대할 수 있습니까?
어둠의 절대자 니트

"당신이 되겠습니까"... 올바른 단어, 반드시 올바른 순서는 아닙니다!
어둠의 절대자 니트

SSD는 실제로 GB의 스토리지 당 비용이 많이 들고 소프트웨어 계층화가 활성화 된 SAN 환경에서 더 효과적입니다. 128 바이트 레코드 (avg)를 가진 가상의 9 억 라인 파일은 11.5GB를 사용하며 128GB OCZ Vertex 4의 비용은 newegg에서 US140 달러입니다. 하나의 파일을 저장하면 $ 12.57의 스토리지가 사용되며 파일 시스템 오버 헤드는 제외됩니다. 미쳤다. IMO-거대한 파일을 만드는 것은 종종 좋지 않은 조언, 자원의 열악한 사용 및 항상 비쌉니다. SSD는 전체 파일 읽기에서 10 배 이상의 속도를 제공합니다.
jim mcnamara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.