문제

제가 작업 중인 제품은 하루에 수천 개의 판독값을 수집하여 이를 NTFS 파티션(Windows XP)에 64k 바이너리 파일로 저장합니다.생산 1년이 지나면 단일 디렉터리에 300,000개 이상의 파일이 있게 되고 그 수는 계속해서 증가합니다.이로 인해 Windows 탐색기에서 상위/조상 디렉토리에 액세스하는 데 시간이 많이 걸렸습니다.

인덱싱 서비스를 꺼보려고 했지만 아무런 변화가 없었습니다.나는 또한 파일 내용을 데이터베이스/zip 파일/타르볼로 옮기는 것을 고려했지만 파일에 개별적으로 액세스하는 것이 유익합니다.기본적으로 파일은 여전히 ​​연구 목적으로 필요하며 연구자들은 다른 어떤 것도 다룰 의향이 없습니다.

이러한 작은 파일을 모두 사용할 수 있도록 NTFS 또는 Windows를 최적화하는 방법이 있습니까?

도움이 되었습니까?

해결책

디렉터리에 파일이 10,000개 있으면 NTFS 성능이 심각하게 저하됩니다.당신이 하는 일은 디렉터리 계층 구조에 추가 수준을 만드는 것입니다. 각 하위 디렉터리에는 10,000개의 파일이 있습니다.

가치 있는 것은 이것이 SVN 사람들이 취한 접근 방식입니다. 버전 1.5.그들은 1,000개의 파일을 기본 임계값으로 사용했습니다.

다른 팁

NTFS는 실제로 16비트 Windows 플랫폼과 호환되는 대체 파일 이름 생성을 중지하도록 지시하는 한 디렉터리에 있는 10,000개 이상의 파일에 대해 제대로 작동합니다.기본적으로 NTFS는 생성되는 모든 파일에 대해 '8 점 3' 파일 이름을 자동으로 생성합니다.Windows는 디렉터리의 파일을 확인하여 생성 중인 이름이 이미 사용 중이 아닌지 확인하기 때문에 디렉터리에 파일이 많을 때 문제가 됩니다.NtfsDisable8dot3NameCreation 레지스트리 값을 1로 설정하여 '8 dot 3' 이름 지정을 비활성화할 수 있습니다.값은 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem 레지스트리 경로에서 찾을 수 있습니다.'8 점 3' 이름 파일은 매우 오래된 Windows 버전용으로 작성된 프로그램에만 필요하므로 이렇게 변경하는 것이 안전합니다.

이 설정을 적용하려면 재부팅이 필요합니다.

성능 문제는 단일 디렉터리에 엄청난 양의 파일이 있기 때문에 발생합니다.일단 그것을 제거하면 괜찮을 것입니다.이는 NTFS 관련 문제가 아닙니다.실제로 대규모 UNIX 시스템의 사용자 홈/메일 파일에서 흔히 발생합니다.

이 문제를 해결하는 한 가지 확실한 방법은 파일 이름에 따라 이름이 지정된 폴더로 파일을 이동하는 것입니다.모든 파일의 길이가 비슷한 파일 이름을 가지고 있다고 가정합니다.ABCDEFGHI.db, ABCEFGHIJ.db 등은 다음과 같은 디렉터리 구조를 만듭니다.

ABC\
    DEF\
        ABCDEFGHI.db
    EFG\
        ABCEFGHIJ.db

이 구조를 사용하면 이름을 기준으로 파일을 빠르게 찾을 수 있습니다.파일 이름에 가변 길이가 있는 경우 최대 길이를 선택하고 파일이 속한 디렉터리를 확인하기 위해 앞에 0(또는 다른 문자)을 추가합니다.

나는 과거에 파일 이름의 첫 번째 문자와 두 번째 문자를 기준으로 파일을 중첩된 디렉터리 계층 구조로 분할함으로써 엄청난 개선을 보았습니다.그러면 각 디렉토리에 과도한 수의 파일이 포함되지 않습니다.그러나 전체 데이터베이스를 조작하는 것은 여전히 ​​느립니다.

Solid File System과 같은 것을 사용해 볼 수 있습니다.

이는 애플리케이션이 마치 물리적 디스크인 것처럼 마운트할 수 있는 가상 파일 시스템을 제공합니다.귀하의 응용 프로그램에는 많은 작은 파일이 있지만 하드 드라이브에는 단 하나의 파일만 있습니다.

http://www.eldos.com/solfsdrv/

파일 이름을 계산할 수 있으면 파일을 날짜별로 폴더로 정렬하여 각 폴더에 특정 날짜의 파일만 보관할 수 있습니다.월 및 연도 계층을 생성할 수도 있습니다.

또한 1년보다 오래된 파일을 다른(그러나 여전히 액세스 가능한) 위치로 이동할 수 있습니까?

마지막으로, 이를 위해서는 이름을 계산할 수 있어야 하며, 파일에 직접 액세스하는 것이 탐색기를 통해 파일을 열려고 하는 것보다 훨씬 빠르다는 것을 알게 될 것입니다.예를 들어 다음과 같이 말합니다.
notepad.exe "P:\ath o\your\filen.ame"
디렉토리 목록을 가져올 필요 없이 필요한 파일의 경로를 알고 있다고 가정하면 명령줄에서 실행하는 작업은 실제로 매우 빠릅니다.

한 가지 일반적인 방법은 단순히 몇 개의 하위 디렉터리를 만들고 파일을 나누는 것입니다.

예를 들어, 수많은 HTML 페이지를 생성할 수 있는 자동화된 코드 문서화 프로그램인 Doxygen에는 2단계 깊은 디렉토리 계층 구조를 생성하는 옵션이 있습니다.그런 다음 파일은 아래쪽 디렉터리에 균등하게 배포됩니다.

단일 디렉터리에 수십만 개의 파일이 있으면 실제로 NTFS가 손상되며 이에 대해 할 수 있는 일이 별로 없습니다.하나의 큰 타르볼이나 데이터베이스와 같은 보다 실용적인 형식으로 데이터를 저장하는 것을 재고해야 합니다.

각 읽기에 대해 별도의 파일이 정말로 필요한 경우 모든 파일을 동일한 디렉터리에 두는 대신 여러 하위 디렉터리로 정렬해야 합니다.디렉터리 계층을 생성하고 파일 이름에 따라 파일을 다른 디렉터리에 배치하면 됩니다.이렇게 하면 파일 이름만 알면 파일을 저장하고 로드할 수 있습니다.

우리가 사용하는 방법은 파일 이름의 마지막 몇 글자를 가져와서 뒤집어서 거기에서 한 글자의 디렉터리를 만드는 것입니다.예를 들어 다음 파일을 고려해보세요.

1.xml
24.xml
12331.xml
2304252.xml

다음과 같이 디렉토리로 정렬할 수 있습니다.

data/1.xml
data/24.xml
data/1/3/3/12331.xml
data/2/5/2/4/0/2304252.xml

이 구성표를 사용하면 각 디렉터리에 파일이 100개를 넘지 않도록 할 수 있습니다.

나는 과거에 이 문제에 여러 번 부딪혔습니다.날짜별로 저장하고, 날짜 아래의 파일을 압축하여 작은 파일이 많지 않도록 하는 등의 방법을 시도해 보았습니다.이들 모두는 데이터를 NTFS에 많은 작은 파일로 저장하는 실제 문제에 대한 반창고였습니다.

작은 파일을 더 잘 처리하는 ZFS 또는 다른 파일 시스템으로 이동할 수 있지만 여전히 작은 파일을 저장해야 하는지 물어보십시오.

우리의 경우 결국 우리는 특정 날짜의 모든 작은 파일을 간단한 구분 기호와 함께 TAR 유형으로 추가하여 구문 분석하는 시스템에 이르렀습니다.디스크 파일이 120만 개에서 수천 개 미만으로 늘어났습니다.NTFS는 작은 파일을 잘 처리할 수 없고 어쨌든 드라이브는 1MB 파일을 더 잘 캐시할 수 있었기 때문에 실제로 로드 속도가 더 빨랐습니다.우리의 경우 파일의 올바른 부분을 찾기 위한 액세스 및 구문 분석 시간은 저장된 파일의 실제 저장 및 유지 관리에 비해 최소화되었습니다.

하위 디렉토리에 파일을 배치하는 것 외에도 ..

개인적으로 저는 해당 폴더에 대한 인터페이스를 동일하게 유지하는 응용 프로그램, 즉 모든 파일이 개별 파일로 표시되는 응용 프로그램을 개발하고 싶습니다.그런 다음 애플리케이션 백그라운드에서 실제로 이러한 파일을 가져와서 더 큰 파일로 결합합니다(그리고 크기가 항상 64k이므로 필요한 데이터를 얻는 것이 상대적으로 쉬울 것입니다). 혼란을 제거합니다.

따라서 원하는 파일에 쉽게 액세스할 수 있도록 할 수 있을 뿐만 아니라 모든 구성 방식을 더 효과적으로 제어할 수도 있습니다.

대량의 작은 파일(예: ZFS가 있는 Solaris)에 더 친숙한 파일 시스템을 사용하는 다른 서버로 푸시하는 것을 고려하시겠습니까?

데이터의 의미 있고 범주적인 측면이 있는 경우 이를 디렉터리 트리에 중첩할 수 있습니다.나는 속도 저하가 파일 자체의 수가 아니라 한 디렉토리에 있는 파일의 수로 인한 것이라고 생각합니다.

가장 명확하고 일반적인 그룹화는 날짜별로 이루어지며 각 리프 디렉터리의 파일 수(1-3k)에 상대적으로 안전한 경계가 있는 3계층 중첩 구조(연도, 월, 일)를 제공합니다.

파일 시스템/파일 브라우저 성능을 향상시킬 수 있다고 하더라도 이는 향후 2년, 3년 후에 직면하게 될 문제인 것처럼 들립니다.0.3~1mil 파일 목록을 보는 것만으로도 비용이 발생하므로 장기적으로는 파일의 더 작은 하위 집합만 보는 방법을 찾는 것이 더 나을 수 있습니다.

'find'(cygwin 또는 mingw 아래)와 같은 도구를 사용하면 파일을 탐색할 때 하위 디렉터리 트리가 문제가 되지 않을 수 있습니다.

타임스탬프를 사용하여 매일 폴더 이름을 바꿉니다.

응용 프로그램이 파일을 c: eadings에 저장하는 경우 자정에 Reading의 이름을 바꾸고 새 빈 폴더를 생성하도록 예약된 작업을 설정합니다.

그러면 매일 수천 개의 파일이 포함된 폴더 하나가 생성됩니다.

이 방법을 추가로 확장하여 월별로 그룹화할 수 있습니다.예를 들어 C: eading은 c:\Archive\September\22가 됩니다.

제품이 폴더에 저장되는 동안 폴더 이름을 바꾸려고 하지 않도록 타이밍에 주의해야 합니다.

알 수 없는 수의 파일로 확장되는 폴더 구조를 만들려면 다음 시스템이 마음에 듭니다.

파일 이름을 고정 길이 조각으로 분할한 다음 마지막 조각을 제외한 각 조각에 대해 중첩 폴더를 만듭니다.

이 시스템의 장점은 폴더 구조의 깊이가 파일 이름의 길이만큼만 깊어진다는 것입니다.따라서 파일이 숫자 순서로 자동 생성되는 경우 구조는 깊이가 있어야 합니다.

12.jpg -> 12.jpg
123.jpg -> 12\123.jpg
123456.jpg -> 12\34\123456.jpg

이 접근 방식은 폴더에 파일과 하위 폴더가 포함되어 있음을 의미하지만 합리적인 절충안이라고 생각합니다.

그리고 여기 아름다운 PowerShell 한 줄로 시작해보세요!

$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$','' ), $s )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top