"크기"와 "디스크의 크기"사이에 왜 큰 차이가 있습니까?


302

아래에서 볼 수 있듯이 내 폴더의 디스크 크기크기 필드에는 많은 차이가 있습니다. 왜 그런 겁니까?

1,504 개의 폴더에 50,875 개의 파일을 표시하는 스크린 샷, 105MB는 디스크에 1.43GB

디스크의 크기 는 Windows의 할당 단위로 인해 크기 보다 조금 더 커야한다는 것을 알고 있지만 왜 그렇게 큰 차이가 있습니까? 파일 수가 많기 때문일 수 있습니까?

BTW,이 폴더는 내 안드로이드 폰의 SD 카드에 있습니다. 이 안에 내지도 앱은 캐시 된지도를 저장하고 앱은 Google지도에서지도를 가져옵니다.


10
마지막으로 안녕하세요, 슈퍼 유저에 오신 것을 환영합니다. 조각 모음에 대한 부분을 제거하기 위해 귀하의 질문을 편집했습니다. 기존의 두 가지 답변은 디스크 불일치의 크기 / 크기에 중점을두고 스택 교환 형식은 게시 된 각 질문이 단 하나 일 때 가장 효과적입니다. 그러나이 질문에 대해 지금까지받은 답변에 따르면 조각 모음이 도움이되지 않는다고 생각하지만 분명히 별도의 질문으로 다시 요청할 수 있습니다. (또한 일반적으로 솔리드 스테이트 미디어에서는 좋지 않습니다.) 어떤 식 으로든 의도가 바뀌 었다고 생각되면 질문을 추가 로 편집 하십시오.
CVn

1
@ MichaelKjörling Heh, 방금 조각화에 대한 사소한 토론에서 편집했습니다 (조금 산만 해졌습니다)
Bob

21
@ MichaelKjörling 답변을 맞추기 위해 소급하여 질문을 편집 하지 마십시오 . 답변 중 하나는 OP 질문의 단편화 부분을 해결합니다. 혼동을 피하기 위해 편집 내용을 롤백해야합니다.
DanteTheEgregore

5
@DanteTheEgregore Bob의 답변을 참조하는 경우 실제로 조각화의 영향을 논의하기 위해 편집 된 Bob의 답변을 참조하는 경우 총을 점프하기 전에 해당 답변과 질문에 대한 편집 기록과 타임 스탬프를 확인하십시오. 편집 당시 Bob의 답변은 조각화 문제를 전혀 다루지 않았습니다. OP가 원하는 경우 "미디어 조각 모음을 수행하면 도움이됩니까?" 나는 여전히 별도의 질문으로 더 나은 느낌 들지만 모든 혼란을 해결해야합니다 . IMO는 두 값의 차이 문제와 관련이 없습니다.
CVn

11
이 앱이 심각하게 잘못 프로그래밍 된 것 같습니다. 버그 보고서 제출을 고려하십시오. 나는 결코 전문 프로그래머가 아니지만 JavaME에서 비슷한 것을 해킹 한 적이 있으며, 해결해야 할 문제 중 하나는 작은 맵 타일을 컨테이너에 효율적으로 저장 (저장 및 액세스)하는 방법이었습니다. 압축되지 않은 zip 파일을 사용했습니다.
A. Donda

답변:


303

여기서는 SD / FAT32 파일 시스템을 사용한다고 가정합니다. 왜냐하면 이것이 SD 카드라고 언급했기 때문입니다. NTFS 및 exFAT는 할당 단위와 관련하여 유사하게 작동합니다. 다른 파일 시스템은 다를 수 있지만 Windows에서는 지원되지 않습니다.

작은 파일이 많은 경우에는 가능합니다. 이걸 고려하세요:

  • 50,000 개 파일

  • FAT32의 최대 값 인 32kB 클러스터 크기 (할당 단위)

자, 이제 최소 공간은 50,000 * 32,000 = 1.6GB입니다 (수학을 단순화하기 위해 이진이 아닌 SI 접두사 사용). 각 파일이 디스크에서 차지하는 공간은 항상 할당 단위 크기의 배수입니다. 여기서는 각 파일이 실제로 하나의 단위 내에 들어가기에 약간의 공간이 남아 있다고 가정합니다.

각 파일의 평균이 2kB 인 경우 총 약 100MB를 얻을 수 있지만 할당 단위 크기로 인해 평균적으로 15 배 (파일 당 30kB)를 낭비하고 있습니다.


심층적 인 설명

왜 이런 일이 발생합니까? FAT32 파일 시스템은 각 파일이 저장된 위치를 추적해야합니다. 모든 단일 바이트의 목록을 유지해야한다면 (주소록과 같은) 테이블은 데이터와 같은 속도로 증가하여 많은 공간을 낭비하게됩니다. 따라서 "클러스터 크기"라고도하는 "할당 단위"를 사용합니다. 볼륨은 이러한 할당 단위로 나뉘며 파일 시스템과 관련하여 세분화 할 수 없습니다. 이는 처리 할 수있는 가장 작은 블록입니다. 집 번호가있는 것처럼 우체국 장은 침실이 몇 개인 지 또는 누가 살고 있는지 신경 쓰지 않습니다.

매우 작은 파일이 있으면 어떻게됩니까? 파일 시스템은 파일이 0kB, 2kB 또는 15kB인지 상관하지 않으므로 위의 예에서 32kB 인 공간을 최대한 줄입니다. 파일은이 공간을 소량 만 사용하고 나머지는 기본적으로 낭비되지만 여전히 파일을 차지합니다. 마치 침실을 비우십시오.

할당 단위 크기가 다른 이유는 무엇입니까? 글쎄, 그것은 더 큰 테이블 (주소록, John이 123 Fake Street, 124 Fake Street, 666 Satan Lane 등의 집을 소유하고 있다고 말함) 또는 각 단위 (집)에서 더 많은 공간을 낭비하는 것 사이의 균형이됩니다. 더 큰 파일이 있으면 더 큰 할당 단위를 사용하는 것이 더 좋습니다. 다른 모든 파일이 채워질 때까지 파일은 새 단위 (하우스)를 갖지 않기 때문입니다. 작은 파일이 많으면 어쨌든 큰 테이블 (주소록)을 갖게되므로 작은 단위 (집)를 줄 수도 있습니다.

큰 할당 단위는 일반적으로 작은 파일이 많은 경우 많은 공간을 낭비합니다. 일반적으로 일반적인 사용을 위해 4 kB 이상으로 올라갈만한 이유는 없습니다.


분열?

조각화와 관련하여 조각화는 이러한 방식으로 공간을 낭비해서는 안됩니다. 큰 파일은 여러 할당 단위로 분할 (즉, 분할) 될 수 있지만 다음 파일이 시작되기 전에 각 단위를 채워야합니다. 조각 모음을 수행하면 할당 테이블의 공간이 약간 절약 될 수 있지만 이는 특정 문제가 아닙니다.


가능한 해결책

으로 gladiator2345 제안 ,이 시점에서 당신의 유일한 옵션은 함께 살 이하 할당 단위로 포맷한다.

카드는 FAT16으로 포맷 될 수 있는데, 이는 테이블 크기에 대한 제한이 더 작으므로 더 큰 볼륨을 처리하기 위해 훨씬 더 큰 할당 단위가 필요합니다 (32kB 할당 단위로 2GB의 상한). Braiam의 소스 제공 . 이 경우 어쨌든 FAT32로 안전하게 포맷 할 수 있어야합니다.


3
최소 할당 크기로 인해 낭비되는 공간을 실제로는 "내부 조각화" 라고하며 조각화가 원인이라고 말할 있습니다. 그러나 여전히 "조각 모음"도구가 수행 할 수있는 것은 아닙니다.
hobbs

3
(기술적으로 말하면, 그냥 "느슨 함"이라고합니다.)
호브

1
클러스터 크기도 최대 파일 시스템 크기를 제한합니다. 예를 들어, 주소 공간이 32 비트 인 경우 총 ~ 42 억 9 천 개의 총 클러스터가 가능합니다. 이제 NTFS에서 지원하는 가장 작은 클러스터 크기 (512 바이트)를 사용하면 최대 512 * 2 ^ 32 바이트 = 2GiB를 지정할 수 있습니다. 2GiB 이상의 데이터를 저장할 수있는 볼륨이 필요한 경우 클러스터 크기를 늘려야합니다. 이것은 문제를 최소화하는 2GiB보다 큰 파일을 저장할 수 없기 때문에 저장하려는 실제 가장 큰 파일과는 별개입니다.
Andon M. Coleman

4 KiB 클러스터를 사용하면 최대 16TiB 크기의 볼륨으로 파일을 처리 할 수 ​​있습니다.
Andon M. Coleman

1
그는 작은 파일을 하나의 큰 파일로 압축 할 수있었습니다.
einpoklum

45

이것은 하나의 파일로 압축 / 아카이빙이 도움이 될 수있는 상황 중 하나입니다. 어떤 밥이 그의 대답에서 말했다 것은 사실이다 하지만이 솔루션은 다른 답변에서 알 수 있듯이 디스크를 reformating 더 쉽게 할 수있다. zip, tar 또는 다른 방법을 사용하여 디렉토리를 압축하거나 아카이브하면 파일 시스템에 여러 개의 작은 파일 대신 하나의 큰 파일이 있음을 알 수 있습니다. 압축하지 않아도 거의 1.4GiB의 공간을 되 찾을 수 있습니다. 이러한 "작은 파일"은 모두 하나의 큰 파일로 계산되기 때문입니다.

이 안에 내지도 앱은 캐시 된지도를 저장하고 앱은 Google지도에서지도를 가져옵니다.

여러 파일 대신 아카이브 나 데이터베이스를 사용하려면 개발자와상의해야합니다. 이것은 아마도 디스크 조각화를 줄이는 데 도움이되며 특히 NAND 플래시 드라이브 인 경우 공간을 절약 할 것입니다. 100MB의 페이로드 / 유용한 데이터가 1.4GiB가되는 어리석은 상황을 설명하면 데이터 저장 방법에 문제가 있으며 개발자가 더 나은 솔루션을 제공해야합니다.


1
>이 안에 내지도 앱은 캐시 된지도를 저장하고 앱은 Google지도에서지도를 가져옵니다. -불행히도이 경우 압축 (실제로는 파일 시스템보다 파일 시스템)이이 맵핑 앱의 지원이 필요합니다.

1
@Bob

4
그것은 사실이다. 나는 당분간 내 앱을 바꿔야한다고 생각합니다.
vfsoraki

17
@Braiam 파일 시스템이 하나의 파일 만 있다고 생각하도록 속이지는 않습니다. 거기에 있다 하나의 파일은. 개발자가 캐시 정보를 아카이브에 저장하지 않는 이유는 아마도 대부분의 아카이브 형식이 캐시에 필요한 빠른 임의 쓰기를 위해 설계되지 않았기 때문일 것입니다. 더 나은 대안은 SQLite와 같은 경량 데이터베이스 라이브러리를 사용하는 것입니다.
bcrist

1
절대적으로 진실 ..... +1
arundevma

25

누구든지이 문제에 직면 한 경우 디스크의 파일 크기 / 공간에서 큰 차이를 보는 또 다른 이유는 대체 데이터 스트림 (ADS)을 사용한다는 것입니다.

이것은 내 지식에 NTFS에만 적용됩니다. ADS는 합법적이거나 합법적이지 않은 용도로 알려져 있습니다.

  • 인터넷에서 다운로드 한 파일에 태그를 지정하려면
  • 메타 데이터 저장
  • 멀웨어의 맥락에서 데이터 또는 코드를 숨길 수 있습니다 .

ADS 간단히 : 모든 NTFS 파일은 여러 데이터 스트림을 보유 할 수 있습니다 ( "서브 파일"이해). 하나는 Windows 탐색기 및 기타 Windows 도구에서 사용되는 기본 스트림이며 일반적인 파일 내용을 보유합니다. 대체 데이터 스트림에는 기본 스트림과 같은 다른 정보가 포함될 수 있지만 Windows 도구에서 직접 처리 할 수는 없습니다 (특히 탐색기는 파일 크기를 ADS의 크기에 상관없이 메인 스트림의 크기와 동일하게 표시합니다). ADS를 작성, 읽고, 찾으려면 특수 도구 나 코드를 사용해야합니다.

중요한 점은 파일 크기 차이가 큰 경우 ADS 및 숨겨진 맬웨어의 가능성을 간과하지 마십시오.

다른 링크 .

ADS를 안전하게 실험하려면 DOS / CMD 수준에서 시도하십시오.

C의 루트에 파일 내용을 만든 다음 표시하십시오.

C:\> echo The main data stream> test.txt
C:\> type test.txt

결과:

C:\> The main data stream

이제 동일한 방법으로 ADS를 추가하고 파일 이름 외에 ADS 이름을 지정하십시오.

C:\> echo The secret message> test.txt:secret

파일에서 비밀 메시지를 숨겼습니다. ADS "secret"에 바이트를 추가 했음에도 불구하고 탐색기의 파일 크기는 변경되지 않았습니다.

ADS 컨텐츠를 표시하십시오.

C:\> type test.txt:secret

결과:

The filename, directory name, or volume label syntax is incorrect.

CMD type는 ADS의 내용을 표시 할 수 없습니다. 대신 메모장을 사용합니다.

notepad test.txt:secret

메모장에서 ADS의 내용을 볼 수 있습니다.

The secret message

무고한 텍스트 파일의 ADS에서 전체 실행 파일을 숨기고 언제든지 실행할 수 있습니다. 부는 해커에게 해를 끼치 지 않습니다 :-)


나는 윈맨이 아니며 내 작업은 대부분 Linux에서 수행됩니다. 이것은 매우 유용했습니다. 감사합니다
vfsoraki

4
Sysinternals의 Streams와 같은 도구를 사용하여 ADS 사용을 확인하는 것이 좋습니다. 예를 들어, Windows 시스템에서 다운로드 한 파일은 ADS의 소스로 태그가 지정 될 수 있지만 크기가 작고 공간을 차지해서는 안됩니다. 일반적으로 dir 또는 Explorer 출력에 표시되지 않습니다. 블록을 차지하고 조사중인 디스크 사용 문제를 악화시킬 수 있습니다. .
adric

19

클러스터 크기 때문에 문제가 발생했을 수 있습니다.

Microsoft 에 따르면 :

볼륨에 포함 된 파일이나 폴더에 대해 NTFS 압축을 사용하지 않는 경우 SIZE와 SIZE ON DISK의 차이는 필요한 클러스터 크기보다 크기 때문에 공간이 낭비됩니다. SIZE ON DISK 값이 가능한 한 SIZE 값에 가깝도록 최적의 클러스터 크기를 사용해야합니다. SIZE ON DISK와 SIZE 값 사이의 과도한 불일치는 기본 클러스터 크기가 볼륨에 저장하는 평균 파일 크기에 비해 너무 커서 축소해야 함을 나타냅니다. 이는 볼륨을 백업 한 다음 format 명령과 / a 스위치를 사용하여 적절한 할당 크기를 지정하여 볼륨을 다시 포맷해야만 수행 할 수 있습니다. IE : format D: /a:2048 (이 예에서는 2KB 클러스터 크기를 사용합니다).

더 작은 클러스터 크기로 드라이브를 포맷하십시오.


4
즉, 클러스터 크기를 4096 바이트 미만으로 만들거나이 숫자의 배수로 만들면 안됩니다. 32 비트 OS는 (PAE가 아닌 경우) 4096 바이트 인 페이지에서 작동하므로 비다 중 클러스터를 사용하면 파일 시스템 성능에 부정적인 영향을 줄 수 있습니다. 이것이 기본 크기가 4096 바이트로 설정된 이유입니다.
Ruslan

2
@Ruslan의 말에 덧붙이 자면, 새로운 하드 드라이브는 이제 4 kB 섹터 크기를 가지며 파일 시스템을 물리 섹터에 맞추는 것이 가장 좋으며 할당 단위 크기는 물리 섹터 크기의 배수를 갖습니다.

1
@Ruslan 나는 그것이 4096의 두 배의 힘이되어야한다고 말하는 것을 믿는다. 12288 (3 × 4096)과 20480 (5 × 4096)은 훌륭한 선택이 아니다.
Scott

9

더 작은 클러스터 크기로 드라이브를 다시 포맷하는 것이 좋습니다. 이 카드는 SD 카드이므로 많은 공급 업체가 NAND의 클러스터 크기와 일치하도록 권장 클러스터 크기로 카드를 사전 포맷합니다 (동기화를 유지하는 것은 최적의 읽기 / 쓰기 성능과 마모를 줄이기 위해 매우 중요합니다)

NAND의 클러스터 크기는 변경할 수 없습니다 (SD 카드 하드웨어의 물리적 특성).

먼저 SD 카드에서 scandisk / chkdsk를 실행하여 크기 보고서 문제가 손상된 파일 시스템 내에 있지 않은지 확인하십시오.

둘째, 버그를 Google Map 개발자에게보고하십시오. 그들은 우수한 저장 방법을 사용해야합니다. 또한 수정하면 I / O가 적고 파일 시스템의 드라이버 활동으로 인해 많은 장치에서 앱이 더 빨리 실행됩니다.


실제로 Google지도는 아니지만 Google지도를 사용하는 다른 앱이었습니다. 개발자에게 알리고 SD에서 해당 파일을 제거했습니다.
vfsoraki

7

이것은 많은 파일 시스템에서 일반적인 문제입니다. 여기에는 파일 시스템이 논리 볼륨 당 처리 할 수있는 최대 "블록"수와 저장 매체의 물리적 제한이라는 두 가지 요소가 있습니다. 주어진 블록에는 하나의 파일 만 할당 할 수 있습니다 (파일은 일반적으로 필요한만큼 많은 블록을 사용합니다). 따라서 64 바이트의 텍스트 파일은 파일 시스템의 블록 크기에 따라 4k에서 32k 사이의 값을 가질 수 있습니다.

이것을 생각하는 한 가지 방법은 파일 시스템의 각 블록을 상자로, 파일 시스템을 방으로 생각하는 것입니다. 모든 상자는 같은 크기이며 방에 최대한 많이 넣으려고 노력합니다. 더 많은 공간을 남겨둔 채 모두에 맞추려면 더 큰 상자를 가져 와서 방이 상자로 완전히 채워지도록해야합니다.

상자에 물건을 넣는 규칙 중 하나는 상자에 두 가지 관련이없는 물건을 넣을 수 없다는 것입니다. 그것들은 같은 문서의 일부 여야합니다. 따라서 한 페이지의 텍스트를 입력하면 자체 상자가 있습니다. 입력 한 텍스트에 너무 많은 페이지가 있으면 한 상자에 모두 넣을 수 없었습니다. 다른 상자를 찾아서 대신 페이지를 넣는 대신 모든 페이지를 제출할 때까지 반복합니다. 또한 해당 문서에 사용한 상자와 순서대로 읽는 순서를 적어 두었습니다.

상자를 구성하는 방법에 따라 매니페스트에 특정 수의 상자를 넣을 공간이 충분할 수 있습니다. 따라서 채울 공간이 크지 만 상자 수가 적 으면 방 용량에 도달하려면 매우 큰 상자를 사용해야합니다.

따라서이 경우 내 한 페이지 문서는 여전히 단일 상자를 차지하며 다른 상자는 공유하지 않습니다.

다양한 스토리지 솔루션에서 동일한 상황이 발생합니다. FAT32는 오늘날의 거대한 하드 드라이브에서 적은 수의 "상자"로 간주되는 항목 만 관리 할 수 ​​있으므로이를 보완하기 위해 매우 큰 "상자"로 끝납니다.


6

클러스터 크기 외에도 다음과 같은 조건으로 인해 불일치가 발생할 수 있습니다.

  • 압축 또는 암호화 된 파일은 논리 파일 크기와 다른 공간을 차지할 수 있습니다.
  • 링크 된 파일은 논리 파일 크기에 대한 링크 크기와 파일 크기의 n 배 를보고 하지만 사용되는 실제 공간은 일반적으로 적습니다.

일반적으로, 그것은 사실 일 수 있습니다. 그러나 제 경우에는 높은 할당 단위가 문제였습니다.
vfsoraki

3
예, 불일치에 대한 더 많은 이유를 제시하여 답변에 추가하려고합니다.
Archimedes Trajano

6

위키 백과의 하위 할당 차단 항목을 살펴 봐야합니다. 그것이 바로 당신에게 일어나는 일입니다. Tail Packaging을 지원하는 파일 시스템을 사용하는 것은 할당 클러스터 크기를 변경하는 것 외에이 문제에 대한 파일 시스템 레벨 솔루션입니다.

모두 디스크를 다시 포맷해야하는 불편 함이 있습니다.

경우에 따라서는 파일을 아카이브에 저장하는 것만으로도 문제가 해결 될 수 있습니다 (그리고 파일 끝에서 공간을 잃어버린 것 외에 작은 파일도 압축됩니다). 이것은 감압에 약간의 시간을 소비하는 것이 불편하다.

특정 응용 프로그램 관련 문제로 인해 작은 파일이 너무 많으면 다른 방법 (데이터베이스에있을 수 있음)을 사용하여 소프트웨어 데이터를 저장하는 것입니다. 물론 최종 사용자가 아닌 프로그래머를위한 솔루션입니다.

http://en.wikipedia.org/wiki/Tail_packing


0

Windows 10에서 개별 파일의 파일 크기 불일치가 크지 만 Windows XP와 동일한 위치 (네트워크 드라이브)에서 SAME 파일의 속성을 보면 큰 불일치가 없습니다. 약간의 차이 만 있으면됩니다. Windows 10에 버그가 있다고 생각합니다. 449MB의 파일은 아마도 3.99GB를 차지하지 않을 것입니다. 이것이 Windows 10이 알려주는 것입니다.


1
참고로, 문제는 Windows 10과 관련이 없습니다. OP는 Windows 7을 사용하고 있습니다.
TheKB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.