Programing

많은 양의 파일이 포함 된 디렉토리에서 파일 검색

crosscheck 2020. 12. 3. 07:33
반응형

많은 양의 파일이 포함 된 디렉토리에서 파일 검색


* .wav 형식의 거의 14,000,000 오디오 샘플이 포함 된 디렉토리가 있습니다.

모든 일반 저장소, 하위 디렉터리 없음.

파일을 반복하고 싶지만 DirectoryInfo.GetFiles()해당 폴더에서 사용 하면 전체 응용 프로그램이 몇 분 동안 정지됩니다!

다른 방법으로 할 수 있습니까? 아마도 1000을 읽고 처리 한 다음 다음 1000을 가져가는 등의 작업이 가능할까요?


DirectoryInfo 클래스의 EnumerateFiles 메서드 를 사용해 보셨습니까 ?

MSDN이 말했듯이

EnumerateFilesGetFiles방법은 다음과 다를 : 당신이 사용하는 경우 EnumerateFiles, 당신의 컬렉션을 열거 시작할 수 있습니다 FileInfo전체 컬렉션을 반환하기 전에 객체를; 를 사용할 때 GetFiles배열에 FileInfo액세스하려면 개체 의 전체 배열 이 반환 될 때까지 기다려야합니다 . 따라서 많은 파일과 디렉토리로 작업 EnumerateFiles할 때 더 효율적일 수 있습니다.


.NET 4.0에서 Directory.EnumerateFiles(...)is IEnumerable<string>( string[]of가 Directory.GetFiles(...)아님)이므로 항목을 모두 버퍼링하는 대신 스트리밍 할 수 있습니다.

foreach(var file in Directory.EnumerateFiles(path)) {
    // ...
}

Windows 파일 시스템 자체의 한계에 도달하고 있습니다. 디렉터리에있는 파일 수가 너무 많아지면 (14M이이 임계 값을 훨씬 초과 함) 디렉터리 액세스 속도가 엄청나게 느려집니다. 한 번에 하나의 파일을 읽든 1000 개를 읽는지는 실제로 중요하지 않으며 디렉토리 액세스 일뿐입니다.

이를 해결하는 한 가지 방법은 하위 디렉터리를 만들고 파일을 그룹으로 분리하는 것입니다. 각 디렉토리에 1000-5000이 있으면 (추측하지만 실제 숫자로 실험 할 수 있음) 파일 열기 / 생성 / 삭제 성능이 괜찮습니다.

그렇기 때문에 모든 클래스에 대한 파일을 생성하는 Doxygen과 같은 응용 프로그램을 보면이 체계를 따르고 모든 것을 임의의 이름을 사용하는 2 단계 하위 디렉터리에 넣습니다.


Win32 Api FindFile 함수를 사용 하여 앱을 차단하지 않고 수행합니다.

System.Threading.Task (TPL) 에서 Directory.GetFiles를 호출 하여 UI가 고정되지 않도록 할 수도 있습니다 .


즐겨.

    public List<string> LoadPathToAllFiles(string pathToFolder, int numberOfFilesToReturn)
    {
        var dirInfo = new DirectoryInfo(pathToFolder);
        var firstFiles = dirInfo.EnumerateFiles().Take(numberOfFilesToReturn).ToList();
        return firstFiles.Select(l => l.FullName).ToList();
    }

저는 단일 디렉토리에있는 대용량 파일에 많은 시간을 액세스하는이 문제에 부딪 혔습니다. 하위 디렉터리는 좋은 옵션이지만 곧 도움이되지 않는 경우도 있습니다. 지금 내가하는 일은 디렉토리에있는 모든 파일의 이름이있는 텍스트 파일 인 색인 파일을 만드는 것입니다 (해당 디렉토리에 파일을 만드는 경우). 그런 다음 색인 파일을 읽은 다음 처리를 위해 디렉토리에서 실제 파일을 엽니 다.

참고 URL : https://stackoverflow.com/questions/7865159/retrieving-files-from-directory-that-contains-large-amount-of-files

반응형