기술 설명
대부분의 방법으로 문제가 발생하는 이유는 Windows가 파일과 폴더를 열거하려고하기 때문입니다. 이것은 수백 또는 수천 개의 파일 / 폴더에 몇 레벨의 깊이에 큰 문제가 아니지만 수백만 개의 폴더에 수조 개의 파일이 수십 레벨에 이르는 경우 시스템을 다운시킬 수 있습니다. .
"10 만 개의 파일 만"가지고 있고 Windows는 다음과 같은 간단한 구조를 사용하여 각 파일을 경로와 함께 저장합니다 (각 디렉토리를 따로 저장하지 않도록하여 약간의 오버 헤드를 줄입니다).
struct FILELIST { // Total size is 264 to 528 bytes:
TCHAR name[MAX_PATH]; // MAX_PATH=260; TCHAR=1 or 2 bytes
FILELIST* nextfile; // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}
8 비트 문자를 사용하는지 또는 유니 코드 문자를 사용하는지 (유니 코드를 사용하는지) 시스템이 32 비트 또는 64 비트인지 여부에 따라 목록을 저장하려면 25GB에서 49GB의 메모리가 필요합니다 (매우 중요합니다) 단순화 된 구조).
이유 왜 윈도우를 삭제하기 전에 파일과 폴더를 열거하려고 당신이 그들을 제거하기 위해 사용하는 방법에 따라 다르지만, 모두 탐색기 명령 인터프리터 (명령을 시작할 때 지연을 볼 수 있습니다) 그것을 할. 드라이브에서 디렉토리 트리를 읽을 때 디스크 활동 (HDD LED)이 깜박이는 것을 볼 수도 있습니다.
해결책
이러한 상황을 처리하는 가장 좋은 방법은 파일과 폴더를 한 번에 하나씩 삭제하는 삭제 도구를 사용하는 것입니다. 그것을 할 수있는 기성 도구가 있는지는 모르겠지만 간단한 배치 파일로 수행 할 수 있어야 합니다.
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
이것이하는 일은 인수가 전달되었는지 확인하는 것입니다. 그렇다면 지정된 디렉토리로 변경됩니다 (현재 디렉토리에서 시작하거나 다른 드라이브에서도 디렉토리를 지정하기 위해 인수없이 실행할 수 있습니다).
다음으로 현재 디렉토리의 모든 파일을 삭제합니다. 이 모드에서는 아무 것도 열거하지 않아야하며 메모리를 많이 차지하지 않고 파일을 삭제하면됩니다.
그런 다음 현재 디렉토리 의 폴더를 열거하고 자신을 호출하여 각 폴더를 자신에게 전달하여 아래로 반복합니다.
분석
이것이 작동 해야하는 이유 는 전체 트리 에서 모든 단일 파일과 폴더를 열거하지 않기 때문 입니다 . 파일을 전혀 열거하지 않으며 현재 디렉토리의 폴더와 상위 디렉토리 의 나머지 폴더 만 열거합니다 . 주어진 폴더에 단지 수백 개의 하위 디렉토리가 있다고 가정하면, 이것은 너무 나쁘지 않아야하며 전체 트리를 열거하는 다른 방법보다 훨씬 적은 메모리를 필요로합니다.
/r
(수동) 재귀를 사용하는 대신 스위치를 사용하는 것에 대해 궁금 할 수 있습니다 . /r
스위치가 재귀를 수행하는 동안 우리가 피하고 싶은 전체 디렉토리 트리를 미리 열거 하기 때문에 작동 하지 않습니다. 추적하지 않고 삭제하면서 삭제하고 싶습니다.
비교
이 방법을 전체 열거 방법과 비교할 수 있습니다.
당신은“수백만 개의 디렉토리”를 가지고 있다고 말했습니다. 1 억이라고합시다. 트리가 대략 균형을 이루고 폴더 당 평균 약 100 개의 하위 디렉토리를 가정하면 가장 깊은 중첩 디렉토리는 약 4 단계 아래로 내려갑니다. 실제로 전체 트리에는 101,010,100 개의 하위 폴더가 있습니다. (100M이 100과 4로 나눌 수있는 방법을 즐겁게합니다.)
파일을 열거하지 않기 때문에 4 × 100 = 400
주어진 시간에 최대 디렉토리 까지 레벨 당 최대 100 개의 디렉토리 이름 만 추적하면됩니다 .
따라서 메모리 요구 사항은 ~ 206.25KB 여야하며 최신 (또는 다른) 시스템의 범위 내에 있어야합니다.
테스트
불행히도 (?) 수백만 개의 폴더에 수조 개의 파일이있는 시스템이 없으므로 테스트 할 수 없습니다 (마지막으로 ~ 800K 파일이 있다고 생각합니다). 다른 사람이 시도해야합니다 그것.
경고
물론 메모리 만이 유일한 제한은 아닙니다. 삭제하는 모든 파일과 폴더에 대해 시스템이 드라이브를 사용 가능으로 표시해야하기 때문에 드라이브도 병목 현상이 발생합니다. 고맙게도, 이러한 디스크 작업 중 많은 부분이 개별적으로 (최소한 이동식 드라이브가 아닌 하드 드라이브의 경우) 함께 묶여 (캐시되고) 청크로 작성되지만 시스템이 읽을 때 여전히 약간의 스 래싱이 발생합니다 데이터를 씁니다.