하나의 폴더에 많은 (1 천만) 파일 배치


17

우분투 서버에서 실행되는 사이트에 예측 검색 (아래 예 참조) 기능을 추가했습니다. 이것은 데이터베이스에서 직접 실행됩니다. 각 검색에 대한 결과를 캐시하고 존재하는 경우 사용하고 그렇지 않으면 작성하십시오.

cira 천만 개의 결과를 하나의 디렉토리에 별도의 파일로 저장하는 데 문제가 있습니까? 아니면 폴더로 나누는 것이 좋습니다?

예:


5
나누는 것이 좋습니다. 해당 디렉토리의 내용을 나열하려는 모든 명령은 자체적으로 촬영하기로 결정합니다.
muru

8
데이터베이스가 이미 있다면 왜 사용하지 않습니까? DBMS가 파일 시스템과 비교하여 수백만 개의 레코드를 더 잘 처리 할 수있을 것이라고 확신합니다. 파일 시스템을 사용하는 데 어려움을 겪고 있다면 일종의 해시를 사용하여 분할 체계를 만들어야합니다.이 시점에서 IMHO는 DB를 사용하는 것이 덜 효과가 있다고 들립니다.
roadmr

3
모델에 더 잘 맞는 캐싱의 또 다른 옵션은 memcached 또는 redis 일 수 있습니다. 이들은 주요 가치 저장소입니다 (따라서 단일 디렉토리처럼 작동하며 이름만으로 항목에 액세스). Redis는 memcached가 더 많은 임시 항목을 위해 지속되는 경우 (다시 시작할 때 데이터가 손실되지 않음) 지속됩니다.
스티븐 오스터 밀러

2
닭과 계란 문제가 있습니다. 사람들은 그렇게하지 않기 때문에 도구 개발자는 많은 파일을 가진 디렉토리를 처리하지 않습니다. 도구는 파일을 잘 지원하지 않기 때문에 많은 파일을 가진 디렉토리를 만들지 않습니다. 예를 들어 한 번에 이해하고 (이것은 여전히 ​​사실이라고 생각합니다.) os.listdir파이썬에서 생성기 버전을 만들기위한 기능 요청 은 이러한 이유로 플랫하게 거부되었습니다.

필자의 경험에 따르면 Linux 2.6의 단일 디렉토리에서 32k 파일을 초과 할 때 손상이 발생했습니다. 물론이 시점을 넘어서는 튜닝이 가능하지만 권장하지는 않습니다. 몇 개의 하위 디렉토리 계층으로 나누면 훨씬 나아질 것입니다. 개인적으로 디렉토리 당 약 10,000으로 제한하여 2 개의 레이어를 제공합니다.
울프

답변:


25

하나의 디렉토리에 별도의 파일로 1 천만 개의 결과를 저장하는 데 문제가 있습니까?

예. 아마도 더 많은 이유가 있지만 이것들은 내 머리 꼭대기에 게시 할 수 있습니다.

  • tune2fsdir_index성능 저하를보기 전에 대략 100k 개의 파일을 디렉토리에 저장할 수 있는 옵션 (기본 설정) (Ubuntu에서는 켜져 있음)이 있습니다. 그것은 당신이 생각하고있는 10m 파일에 가깝지 않습니다.

  • ext파일 시스템에는 고정 된 최대 수의 inode가 있습니다. 모든 파일과 디렉토리는 1 개의 inode를 사용합니다. 사용하다df -i 파티션과 아이 노드 자유의 뷰. inode가 부족하면 새 파일이나 폴더를 만들 수 없습니다.

  • 같은 명령 rmls와일드 카드를 사용하여 명령을 확장하여 "너무 긴 인수 목록의"로 끝날 때. find파일을 삭제하거나 나열하는 데 사용해야 합니다. 그리고 find느린 경향이 있습니다.

아니면 폴더로 나누는 것이 좋습니다?

예. 가장 확실합니다. 기본적으로 1 디렉토리에 10m 파일을 저장할 수도 없습니다.

데이터베이스를 사용합니다. 웹 사이트 용으로 캐시하려면 " solr "( "분산 인덱싱, 복제 및로드 밸런스 쿼리 제공")을 살펴보십시오 .


8

같은 문제로 끝났습니다. 내 자신의 벤치 마크를 실행하여 모든 폴더를 여러 폴더가있는 것과 동일한 폴더에 배치 할 수 있는지 확인하십시오. 당신이 할 수 있고 더 빠릅니다!

기준

참조 : https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
고마워, 이것은 매우 유용합니다. 나는 이것을 사이트에서 사용하고 있으며 /abc/efg.html 디렉토리 구조를 갖도록이 부분을 다시 프로그래밍하는 것은 실제로 문제가되었습니다. 그래서 나는 앞으로 평평한 디렉토리로 되돌아 갈 것입니다.
Kohjah Breese

0

이진 검색은 수백만 개의 레코드를 쉽게 처리 할 수 ​​있으므로 단일 디렉토리 검색은 문제가되지 않습니다. 아주 빨리 할 것입니다.

기본적으로 32 비트 시스템을 사용하는 경우 2Gb 레코드까지의 이진 검색이 쉽고 좋습니다.

오픈 소스 소프트웨어 인 Berekely DB를 사용하면 전체 결과를 한 항목 아래에 쉽게 저장할 수 있으며 검색 기능이 내장되어 있습니다.

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