많은 양의 파일이 포함 된 디렉토리에서 파일 검색
* .wav 형식의 거의 14,000,000 오디오 샘플이 포함 된 디렉토리가 있습니다.
모든 일반 저장소, 하위 디렉터리 없음.
파일을 반복하고 싶지만 DirectoryInfo.GetFiles()
해당 폴더에서 사용 하면 전체 응용 프로그램이 몇 분 동안 정지됩니다!
다른 방법으로 할 수 있습니까? 아마도 1000을 읽고 처리 한 다음 다음 1000을 가져가는 등의 작업이 가능할까요?
DirectoryInfo 클래스의 EnumerateFiles 메서드 를 사용해 보셨습니까 ?
MSDN이 말했듯이
EnumerateFiles
및GetFiles
방법은 다음과 다를 : 당신이 사용하는 경우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();
}
저는 단일 디렉토리에있는 대용량 파일에 많은 시간을 액세스하는이 문제에 부딪 혔습니다. 하위 디렉터리는 좋은 옵션이지만 곧 도움이되지 않는 경우도 있습니다. 지금 내가하는 일은 디렉토리에있는 모든 파일의 이름이있는 텍스트 파일 인 색인 파일을 만드는 것입니다 (해당 디렉토리에 파일을 만드는 경우). 그런 다음 색인 파일을 읽은 다음 처리를 위해 디렉토리에서 실제 파일을 엽니 다.
'Programing' 카테고리의 다른 글
함수의 반환 유형 얻기 (0) | 2020.12.04 |
---|---|
제약 조건이있는 SQL Server 2005 드롭 열 (0) | 2020.12.04 |
jQuery Validation 플러그인-숨겨진 입력을 확인하고 보이지 않습니까? (0) | 2020.12.03 |
프레임 워크의 Xcode에서 경고 비활성화 (0) | 2020.12.03 |
드롭 다운 자바 스크립트에서 값을 선택하는 방법은 무엇입니까? (0) | 2020.12.03 |