메타데이터가 SQL 데이터베이스에 있을 때 수백만 개의 파일을 저장/검색하는 가장 좋은 방법

StackOverflow https://stackoverflow.com/questions/1257415

문제

처음에는 300만~400만 개의 PDF 파일을 생성하고 하루에 80K의 속도로 계속 생성하는 프로세스가 있습니다.각각은 매우 작을 것입니다(50K). 그러나 제가 걱정하는 것은 쉽게 조회하기 위해 생성하는 파일의 총량을 어떻게 관리할 것인가입니다.일부 세부정보:

  1. 파일이 생성되면 실행할 몇 가지 다른 단계가 있고 참여하는 서버가 몇 개 있으므로 파일이 생성되는 것을 관찰해야 합니다.
  2. 일단 생성되면 내가 작성한 조회 프로세스를 통해 파일을 사용할 수 있습니다.기본적으로 파일별로 고유한 주문 번호를 기준으로 파일을 가져와야 합니다.
  3. 언제든지 기존 주문 번호를 다시 제출할 수 있으며 생성된 파일은 원본을 덮어써야 합니다.

원래는 이 파일들을 모두 NAS의 단일 디렉터리에 기록하려고 계획했지만 이것이 좋은 생각이 아닐 수도 있다는 것을 깨달았습니다. 파일이 수백만 개이고 Windows가 백만 개의 파일 조회를 매우 정상적으로 처리하지 못할 수도 있기 때문입니다.나는 몇 가지 조언을 찾고 있습니다:

  1. 단일 폴더로 괜찮나요?파일은 결코 나열되지 않습니다. 이미 결정한 파일 이름을 가진 System.IO.File을 사용하여만 검색됩니다.
  2. 폴더를 만들면 파일이 많아도 System.IO.DirectoryWatcher를 사용하여 새 파일을 감시할 수 있나요? 아니면 파일이 많으면 느려지기 시작하나요?
  3. 대신 SQL Server 데이터베이스에 BLOB으로 저장해야 합니까?참조 값으로 검색해야 하므로 이것이 더 의미가 있을 수 있습니다.

당신의 생각에 감사드립니다!

도움이 되었습니까?

해결책

나는 특정 하위 폴더로 파일을 그룹화하고 일부 비즈니스 로그 방식으로이를 구성하려고 노력합니다. 아마도 모든 파일이 주어진 날에 만들어 졌을까요? 매일 6 시간 동안? 또는 파일의 모든 #, 나는 최대 1000 개의 최대를 말할 것입니다. (아마도 이상적인 숫자가있을 것입니다. 누군가가 그것을 게시 할 것입니다.)

파일이 나이가 들고 삭제 되나요? 그렇다면 정렬 및 파일은 삭제 가능한 청크입니다. 그렇지 않다면, 나는 당신의 하드웨어 공급 업체가 될 수 있습니까?

데이터베이스에 파일을 저장하는 양쪽에 인수가 있습니다.

  • 한편으로는 보안이 향상됩니다. 왜냐하면 DB에서 파일을 가져 오는 것이 더 어색하기 때문입니다. 반면에, 당신은 잠재적으로 성능이 저하됩니다. 왜냐하면 DB에서 파일을 가져 오는 것이 더 어색하기 때문입니다.
  • DB에서는 폴더, 섹터, NAS 클러스터 등의 파일 수에 대해 걱정할 필요가 없습니다. 이것이 DB의 문제 일 것입니다. 아마도 그것에 대해 좋은 구현을 받았을 것입니다. 반면에, 데이터를 관리/검토하기가 더 어려울 것입니다. 단일 테이블의 바질 덩어리가 될 것이기 때문에, 음. (테이블 파티셔닝에 1000 개의 파티션이 있기 때문에, 미리 언급 된 비즈니스 로그를 기반으로 테이블을 분할 할 수 있습니다.
  • SQL Server 2008에는 FILESTREAM 데이터 유형이 있습니다. 나는 그것에 대해 많이 모른다.

마지막으로 걱정하는 것은 데이터를 "정렬"하는 것입니다. DB가 파일에 파일의 경로/이름과 함께 파일에 정보를 저장하고 파일이 이동하면 완전히 호흡 할 수 있습니다.

다른 팁

귀하의 질문에 답변하려면:

  1. 나는 그것들을 단일 폴더에 저장하지 않을 것입니다.어떤 시점에서 기회가 있으므로 디스크의 실제 파일을보고 다른 방식으로보고 싶을 것입니다.
    대신 별도의 디렉토리에 저장하고 1000개의 배치로 분할하는 것은 어떨까요?아마도 ID를 키로 사용하는 것 같습니다.
  2. 그렇게 많은 파일이 DirectorWatcher를 가득 채울 것이므로 일부는 손실될 것입니다.나는 과거에 이것을 사용해 왔으며 특정 지점(수백)이 지나면 파일이 누락되기 시작하는 것을 발견했습니다.들어오는 파일에 대해 다른 디렉터리를 사용한 다음 이를 자주 처리할 수도 있습니다.그러면 원본을 업데이트하는 프로세스가 시작될 수 있습니다.
  3. 나는 문서를 데이터베이스에 저장하지 않고 메타데이터를 데이터베이스에 저장합니다.

비즈니스 로직 또는 하루의 주문 으로이 작업을 수행하지 않고도 여러 폴더로 파일을 쉽게 구성 할 수 있습니다. 이는 주문이 'Clumpy'(한 폴더의 많은 히트, 다른 폴더에서는 소수)라면 특히 좋습니다.

이 작업을 수행하는 가장 쉬운 방법은 파일 이름에 고유 한 해시를 만드는 것입니다. 따라서 다음과 같은 것을 얻을 수 있습니다.

sf394fgr90rtfofrpo98tx.pdf

그런 다음 이것을 두 개의 문자 블록으로 나누면 다음을 얻을 수 있습니다.

sf/39/4f/gr/90/rt/fo/fr/po/98/tx.pdf

보시다시피, 쉽게 탐색 할 수있는 깊은 디렉토리 트리를 제공합니다.

좋은 해시 기능을 사용하면 매우 균등하게 분산되며 디렉토리 당 1296 개 이상의 항목을 얻지 못할 것입니다. 충돌을받는 경우 (극히 드문 경우) 끝에 숫자를 추가하십시오 : TX.PDF, TX_1.PDF, TX_2.PDF. 다시 말하지만, 그러한 큰 해시의 충돌은 극히 드물어야하므로, 이로 인해 당신이 얻는 덩어리의 종류는 문제가되지 않습니다.

당신은 문서가 디지털로 서명되었다고 말했기 때문에 아마도 서명 문자열의 형태로 필요한 해시가있을 것입니다.

1) 간단한 폴더는 별도의 색인으로 허용 할 수 있지만 하위 디렉토리에 넣는 것은 사소한 일이므로 자신을 탐색 할 수있는 능력이 있습니다.
이제 이름 지정 컨벤션을 알아 내야합니다. 비록 보통 해시를 제안하지만 ID를 균일하게 분포 할 수 있지만, 너무 많이하고 있기 때문에 이미 가지고있는 값을 사용하는 것이 합리적 일 것입니다. 주문 번호가 있다면 타임 스탬프도 있습니까? 그렇다면 주문 번호를 타임 스탬프로 접두사 만 접두하십시오.

주문 ID를 사용하는 경우 경험할 수 있습니다. http://en.wikipedia.org/wiki/benford%27S_LAW

테스트해야합니다.이러한 모든 솔루션은 기본 파일 시스템에 따라 다릅니다.일부 파일 시스템은 거대한 디렉토리를 처리할 수 있지만 일부는 그렇지 않습니다.일부 파일 시스템은 해당 디렉토리를 색인화하지만 일부는 그렇지 않습니다(이 두 가지 사항이 반드시 관련되어 있는 것은 아닙니다).

디렉토리 트리로 항목을 나누는 것은 결국 개별 디렉토리에 전체 항목이 거의 없는 경향이 있기 때문에 성능을 발휘할 수 있는 합리적인 기회가 있습니다.이는 대부분의 파일 시스템에서 작동합니다. 왜냐하면 파일에 대해 선형 디렉토리 검색을 수행하는 "멍청한" 시스템이라도 합리적으로 빠르게 몇 백 개의 항목을 검색할 수 있기 때문입니다.

파일 시스템이 디렉토리를 인덱싱하는 경우(예: btree 또는 단순히 내부적으로 정렬하는 것은 이 컨텍스트에서 사실상 동일한 것임) 일부 도구가 불평할 수 있지만(Windows 탐색기 창 로드) 디렉토리 크기는 덜 중요합니다. 4M 파일이 있으면 무슨 일이 일어날지 알 수 있습니다).

그래서 저는 귀하가 계획한 운영 체제와 파일 시스템 옵션을 조사하고 테스트한 후 귀하에게 가장 적합한 것이 무엇인지 알아보겠습니다.

하위 디렉터의 논리적 순서를 결정하고 폴더에 512 개 이상의 파일의 블록에 저장하십시오.

파일을 데이터베이스에 저장하지 마십시오. 데이터베이스는 데이터 용이며 파일 서버는 파일 용입니다. 파일 서버에 저장하지만 경로와 검색 정보를 데이터베이스에 저장하십시오.

PDF로 DB (BLOB)로 변환 한 후 모든 파일을 저장하는 것을 고려해 보지 않으므로 다음과 같은 장점이 있습니다.

  1. 나는 당신이 OS I/O와 Direclty를 다루지 않아도되고 모든 것을 DB에 맡기지 않겠다고 생각합니다.
  2. 해시 명명 할 필요가 없습니다
  3. 백업 및 유지 관리가 쉽습니다

데이터베이스를 사용하여 파일을 저장할 때 특히 작은 파일을 사용하면 오버 헤드가 작아야합니다. 그러나 다음과 같은 작업도 수행 할 수 있습니다.

DELETE FROM BLOBTABLE WHERE NAME LIKE '<whatever>'

또는 만료 날짜가 있거나 파일을 새로 고치려면 다음과 같이 제거합니다.

DELETE FROM BLOBTABLE WHERE CREATIONDATE < ...
etc...

의문:

이 문서를 PDF로 생성하고 저장 해야하는 이유는 무엇입니까?

생성 할 수 있다면 데이터베이스에 데이터를 유지하고 필요할 때 즉시 생성하지 않겠습니까? 즉, 어쨌든 검색하는 데 필요한 실제 데이터를 검색하고 디스크에 파일이 없을 수 있습니다. 이렇게하면 필요한 경우 필요한 경우 PDF 템플릿을 업데이트 할 수 있습니까?

1) 이것은 내가 일반적으로 설교하는 것과 완전히 상반되지만, 작은 파일이기 때문에 SQL 데이터베이스에 저장하고 싶을 수도 있습니다. SQL Server를 사용하면 일반적으로 큰 디렉토리를 열거하는 것과 관련된 미친 디스크 쓰레기없이 필요한 파일을 빠르고 쉽게 찾을 수 있습니다. 또한 파일을 SQL에 저장하면 (일반적으로 반대하는 동안) 백업 / 복원 프로세스가 크게 완화됩니다.

2) 디렉토리에 모두 저장하고 Windows 인덱싱 서비스로 색인하십시오 (산산조각) 또는 파일 이름과 전체 경로를 포함하는 SQL Server에서 고유 한 색인을 만듭니다. 각각 수만 개의 파일만으로 별도의 디렉토리에 저장하는 것이 좋습니다. 아마도 주문 연도를 폴더 이름으로 사용할 수 있습니까?

그들의 저장 방식에 관계없이 - 파일을 찾기 위해 디렉토리를 스캔하지 마십시오 - 당신은 분명히 어떤 종류의 색인이 필요합니다.

도움이 되었기를 바랍니다!

내 파일 데이터베이스에는 4백만 개 이상의 폴더가 포함되어 있으며 각 폴더에는 많은 파일이 있습니다.

그냥 한 디렉토리에 모든 폴더를 버렸습니다.NTFS는 이를 문제 없이 처리할 수 있으며, 이동해야 할 때 robocopy와 같은 고급 도구가 도움이 될 수 있습니다.

스캔하지 않고도 파일을 색인화할 수 있는지 확인하세요.나는 mysql 데이터베이스에 내 인덱스를 던져서 이 작업을 수행했습니다.

그래서 파일을 얻기 위해 일부 메타데이터를 바탕으로 mysql 데이터베이스를 검색하고 색인을 얻습니다.그런 다음 이 색인을 사용하여 파일을 직접 읽습니다.지금까지 나에게 잘 맞게 조정되었습니다.그러나 모든 것을 무작위 액세스로 전환하여 무작위 읽기/쓰기로 전환한다는 점에 유의하세요.HDD로서는 부족한 성능이지만, 다행히 SSD가 도움이 많이 될 것 같습니다.

또한 파일을 mysql 데이터베이스에 넣지 않을 것입니다.mysql을 이해하는 클라이언트가 없으면 네트워크 읽기를 수행할 수 없습니다.지금은 네트워크 URL만 사용할 수 있기 때문에 어떤 프로그램을 사용하여 네트워크를 통해 모든 파일에 액세스할 수 있습니다.

나는 다른 많은 사람들이 말했듯이, 당신은 서브 폴더를해야하지만 코드를 통해 데이터를 찾을 수있는 방식으로해야한다고 생각합니다. 예를 들어, DateTime이 작동하면 사용하십시오. 당신이 말한 내용을 읽는 것부터 보고서에 어떤 형태의 계층 구조가있는 것으로 보일 것입니다 (매일, 매주, 일일 X 보고서, 시간당 Y 보고서 등) 보고서가 생성 및 구축 된 이유의 구조를 살펴 봅니다. 내 디렉토리는 그런 식으로 올라갑니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top