파일 시스템에 백만 개의 이미지 저장 고려하고 있습니다

엄청난 수의 이미지를 생성하는 프로젝트가 있습니다. 시작시 약 1,000,000 그들은 큰 이미지가 아니므로 시작할 때 하나의 머신에 모두 저장합니다.

이러한 이미지를 효율적으로 저장하는 데 어떻게 권장됩니까? (현재 NTFS 파일 시스템)

이름 지정 체계를 고려하고 있습니다 … 시작하려면 모든 이미지의 이름이 1부터 증가합니다. 필요한 경우 나중에 정렬하고 다른 폴더에 넣는 데 도움이되기를 바랍니다.

더 나은 명명 체계는 무엇입니까?

a / b / c / 0 ... z / z / z / 999

또는

a / b / c / 000 ... z / z / z / 999

이것에 대한 아이디어가 있습니까?



답변

데이터베이스 대신 일반 파일 시스템을 사용하는 것이 좋습니다. 파일 시스템을 사용하는 것이 데이터베이스보다 쉬우 며, 일반 도구를 사용하여 파일에 액세스 할 수 있으며, 파일 시스템은 이러한 종류의 용도 등을 위해 설계되었습니다. NTFS는 스토리지 시스템으로서 잘 작동합니다.

데이터베이스의 실제 경로를 저장하지 마십시오. 이미지의 시퀀스 번호를 데이터베이스에 저장하는 것이 좋으며 시퀀스 번호에서 경로를 생성 할 수있는 기능이 있습니다. 예 :

 File path = generatePathFromSequenceNumber(sequenceNumber);

디렉토리 구조를 일부 변경해야하는 경우 처리하기가 더 쉽습니다. 이미지를 다른 위치로 이동해야 할 수도 있고 공간이 부족하여 디스크 A와 디스크 B에 이미지를 저장하기 시작할 수도 있습니다. 데이터베이스의 경로를 변경하는 것보다 하나의 기능을 변경하는 것이 더 쉽습니다. .

디렉토리 구조를 생성하기 위해 이러한 종류의 알고리즘을 사용합니다.

  1. 먼저 12 자리 이상의 문자열이 나올 때까지 숫자를 앞에 0으로 채 웁니다. 파일 이름입니다. 접미사를 추가 할 수 있습니다.
    • 12345 -> 000000012345.jpg
  2. 그런 다음 문자열을 2 개 또는 3 개의 문자 블록으로 분할하십시오. 여기서 각 블록은 디렉토리 레벨을 나타냅니다. 고정 된 디렉토리 레벨 수를 가져 오십시오 (예 : 3).
    • 000000012345 -> 000/000/012
  3. 파일을 생성 된 디렉토리에 저장하십시오.
    • 따라서 시퀀스 ID를 가진 파일의 전체 경로와 파일 파일 이름 123000/000/012/00000000012345.jpg
    • 시퀀스 ID를 가진 파일의 12345678901234경우 경로는123/456/789/12345678901234.jpg

디렉토리 구조 및 파일 스토리지에 대해 고려해야 할 사항 :

  • 위의 알고리즘은 모든 리프 디렉토리에 최대 1000 개의 파일이있는 시스템을 제공합니다 (총 파일 수가 10,000 개 미만인 경우)
  • 디렉토리에 포함 할 수있는 파일 및 서브 디렉토리 수에는 제한이있을 수 있습니다. 예를 들어 Linux의 ext3 파일 시스템 은 한 디렉토리 당 31998 개의 서브 디렉토리로 제한됩니다.
  • 디렉토리 당 파일 수가 많은 경우 일반 도구 (WinZip, Windows 탐색기, 명령 줄, bash 쉘 등)가 제대로 작동하지 않을 수 있습니다 (> 1000).
  • 디렉토리 구조 자체는 약간의 디스크 공간을 차지하므로 너무 많은 디렉토리를 원하지 않습니다.
  • 위의 구조를 사용하면 디렉토리 구조를 엉망으로 만드는 경우 파일 이름을보고 이미지 파일의 올바른 경로를 항상 찾을 수 있습니다.
  • 여러 시스템에서 파일에 액세스해야하는 경우 네트워크 파일 시스템을 통해 파일을 공유하십시오.
  • 많은 파일을 삭제하면 위의 디렉토리 구조가 작동하지 않습니다. 디렉토리 구조에 “구멍”을 남깁니다. 그러나 파일을 삭제하지 않기 때문에 괜찮습니다.

답변

나는 2 센트의 가치를 부정적인 조언에 넣을 것입니다 : 데이터베이스와 함께 가지 마십시오.

나는 수년 동안 이미지 저장 데이터베이스를 사용해 왔습니다. 큰 (1 메가-> 1 기가) 파일, 종종 변경, 여러 버전의 파일, 합리적으로 자주 액세스하는 파일. 큰 파일을 저장하는 중에 발생하는 데이터베이스 문제는 처리하기가 매우 지루하고 쓰기 및 트랜잭션 문제가 까다로워 심각한 열차 사고를 일으킬 수있는 잠금 문제가 발생합니다. dbcc 스크립트를 작성하고 일반 사람보다 백업에서 테이블을 복원하는 데 더 많은 연습 있습니다.

필자가 작업 한 대부분의 최신 시스템은 파일 스토리지를 파일 시스템으로 푸시했으며 색인 작업 외에는 데이터베이스에 의존하지 않았습니다. 파일 시스템은 이러한 종류의 남용을 처리하도록 설계되었으며 확장하기가 훨씬 쉽고 한 항목이 손상되면 전체 파일 시스템을 거의 잃지 않습니다.


답변

이 문제를 처리해야하는 대부분의 사이트는 파일이 폴더에 고르게 분산되도록하기 위해 일종의 해시를 사용한다고 생각합니다.

따라서 다음과 같은 파일의 해시가 515d7eab9c29349e0cde90381ee8f810
있다고 가정하십시오. 다음 위치에 저장하면 각 폴더의 파일 수를 낮게 유지하는 데 필요한 수준을 얼마나 많이 사용할 수 있습니까?
\51\5d\7e\ab\9c\29\349e0cde90381ee8f810.jpg

이 접근 방식이 여러 번 수행되는 것을 보았습니다. 이러한 파일 해시를 사람이 읽을 수있는 이름과 저장해야 할 다른 메타 데이터에 매핑하려면 여전히 데이터베이스가 필요합니다. 그러나이 접근 방식은 여러 컴퓨터와 스토리지 풀 사이에 해시 주소 공간을 분배 할 수 있기 때문에 꽤 잘 확장됩니다.


답변

이상적으로는 특정 하드 드라이브 설정, 캐싱, 사용 가능한 메모리 등이 이러한 결과를 변경할 수 있으므로 다양한 구조에 대한 임의 액세스 시간에 대해 일부 테스트를 실행해야합니다.

파일 이름을 제어한다고 가정하면 디렉토리 당 1000 레벨로 파일 이름을 분할합니다. 디렉토리 레벨이 많을수록 더 많은 inode를 태우므로 여기에 푸시 풀이 있습니다.

예 :

/ root / [0-99] / [0-99] / 파일 이름

참고 http://technet.microsoft.com/en-us/library/cc781134(WS.10).aspx는 NTFS 설정에 대한 자세한 내용이 있습니다. 특히 “NTFS 폴더 (300,000 이상)에서 많은 수의 파일을 사용하는 경우 짧은 파일 이름 생성을 비활성화하여 성능을 향상 시키십시오. 특히 긴 파일 이름의 처음 6자가 비슷한 경우”

또한 필요하지 않은 파일 시스템 기능 (예 : 마지막 액세스 시간)을 비활성화해야합니다. http://www.pctools.com/guides/registry/detail/50/


답변

무엇을하든 한 디렉토리에 모두 저장하지 마십시오.

이러한 이미지 이름의 분포에 따라 단일 문자 최상위 폴더가있는 디렉토리 구조를 만들 수 있습니다.이 폴더에는 두 번째 이미지 문자 등의 하위 폴더가 있습니다.

그래서:

폴더 img\a\b\c\d\e\f\g\에는 ‘abcdefg’로 시작하는 이미지가 포함됩니다.

필요한 적절한 깊이를 소개 할 수 있습니다.

이 솔루션의 가장 큰 장점은 디렉토리 구조가 해시 테이블 / 사전처럼 효과적으로 작동한다는 것입니다. 이미지 파일 이름이 주어지면 디렉토리를 알 수 있고 디렉토리가 주어지면 이미지의 하위 집합을 알 수 있습니다.


답변

파일 시스템에 저장하지만 파일 수가 얼마나 빨리 증가하는지에 달려 있습니다. 이 파일들은 웹에서 호스팅됩니까? 이 파일에 몇 명의 사용자가 액세스합니까? 더 나은 추천을하기 전에 답변해야 할 질문들이 있습니다. 또한 Facebook의 Haystack을 살펴볼 것입니다. 이미지를 저장하고 제공하는 데 매우 유용한 솔루션이 있습니다.

또한 파일 시스템을 선택하면 이러한 파일을 디렉토리로 분할해야합니다. 나는이 문제를보고 해결책을 제안했지만 결코 완벽한 해결책은 아닙니다. 해시 테이블 및 사용자별로 분할하여 내 블로그에서 더 많은 내용을 읽을 수 있습니다 .


답변

4 백만 개의 이미지가있는 사진 저장 시스템이 있습니다. 우리는 메타 데이터에 대해서만 데이터베이스를 사용하고 모든 이미지는 파일 이름의 마지막 숫자, 마지막 1 등에서 폴더 이름이 생성되는 역 명명 시스템을 사용하여 파일 시스템에 저장됩니다. 예 : 000001234.jpg는 4 \ 3 \ 2 \ 1 \ 000001234.jpg와 같은 디렉토리 구조에 저장됩니다.

이 체계는 전체 디렉토리 구조를 균등하게 채우므로 데이터베이스의 ID 색인과 매우 잘 작동합니다.