태그 보관물: ext4

ext4

`find보다 빠른 것이 있습니까? | wc -l`는 디렉토리의 파일을 계산합니까? 달합니다. 그냥 열거하고 계산하는

드물게 디렉토리의 파일 수를 세어야 할 필요는 없으며 때로는 수백만에 달합니다.

그냥 열거하고 계산하는 것보다 더 좋은 방법이 find . | wc -l있습니까? ext3 / 4에서 I / O 집약도가 낮은 파일 시스템 호출이 있습니까?



답변

기본 속도 향상은 아니지만 최소한 🙂

find . -printf \\n | wc -l

실제로 파일 이름 목록을 전달할 필요는 없으며 개행만으로 충분합니다. 이 변형은 디렉토리가 RAM에 캐시 될 때 우분투 12.04.3에서 약 15 % 빠릅니다. 또한이 변형은 개행을 포함하는 파일 이름에서 올바르게 작동합니다.

흥미롭게도이 변종은 위의 것보다 약간 느린 것 같습니다.

find . -printf x | wc -c

특별한 경우-그러나 정말 빠릅니다

디렉토리가 자체 파일 시스템에있는 경우 간단히 inode를 계산할 수 있습니다.

df -i .

계산 된 것 이외의 다른 디렉토리에있는 디렉토리 및 파일의 수가 크게 변하지 않으면 현재 df -i결과 에서이 알려진 숫자를 빼기 만하면 됩니다. 이 방법으로 파일과 디렉토리를 매우 빠르게 계산할 수 있습니다.


답변

나는 그 목적을 위해 ffcnt 를 썼습니다 . fiemapioctl을 사용하여 디렉토리 자체의 실제 오프셋을 검색 한 다음 무작위 순차 액세스를 줄이기 위해 여러 순차 패스에서 디렉토리 순회를 스케줄링합니다. 실제로 속도 향상 find | wc 여부는 몇 가지 요인 에 따라 다릅니다.

  • 파일 시스템 유형 : fiemapioctl 을 지원하는 ext4와 같은 파일 시스템 이 가장 유리합니다.
  • 랜덤 액세스 속도 : HDD는 SSD보다 훨씬 많은 이점을 제공합니다
  • 디렉토리 레이아웃 : 중첩 된 디렉토리의 수가 많을수록 최적화 가능성이 높아짐

(재) 마운트가 메타 데이터 업데이트를 유발할 경우 속도를 향상 시키 relatime거나 nodiratime모든 방법에서 속도를 향상시킬 수도 있습니다.


답변

실제로 내 시스템 (Arch Linux)에서이 명령

   ls -A | wc -l

위의 모든 것보다 빠릅니다.

   $ time find . | wc -l
  1893

   real    0m0.027s
   user    0m0.004s
   sys     0m0.004s
   $ time find . -printf \\n  | wc -l
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time find . -printf x  | wc -c
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time ls -A | wc -l
   1892

   real    0m0.007s
   user    0m0.000s
   sys     0m0.004s

답변