“Boyut” ile “Diskteki Boyut” arasında neden bu kadar büyük bir fark var?


302

Aşağıda görebileceğiniz gibi, aralarında çok fark var Boyutu ve diskin üzerindeki Boyutu benim klasöründe alanlar. Neden?

1,504 klasörde 50,875 dosya gösteren ekran görüntüsü; 105 MB diskte 1,43 GB'tır.

Bunu biliyorum Disk üzerindeki boyut biraz daha olmalı Boyutu nedeniyle Windows ayırma birimlerinin, ama neden kadar fark olduğunu? Çok sayıda dosya yüzünden olabilir mi?

BTW, bu klasör Android telefonumun SD kartında. Bunun içinde haritalar uygulamam önbelleğe alınmış haritaları saklar ve uygulama haritasını Google Haritalar'dan alır.


10
Thelastblack Merhaba ve SuperUser'a hoş geldiniz. Birleştirmeyle ilgili bölümü kaldırmak için sorunuzu düzenledim, çünkü mevcut iki cevap disk tutarsızlığına boyut / boyut üzerinde odaklanır ve gönderilen her soru tek bir şeyle ilgili olduğunda Stack Exchange formatı en iyi şekilde çalışır. Bununla birlikte, ayrı bir soru olarak kesinlikle tekrar sorabilirsiniz, ancak bu soruya kadar aldığınız cevapların birleştirme işleminin size yardımcı olmayacağını gösterdiğini düşünüyorum. (Aynı zamanda, katı halli medyada genellikle hiçbir yararı yoktur.) Niyetinizi herhangi bir şekilde değiştirdiğimi düşünüyorsanız, sorunuzu daha fazla düzenlemek için çekinmeyin.
Bir CVn

1
@ MichaelKjörling Heh, parçalanma konusundaki küçük bir tartışmaya yeni girdim (biraz daha önce dikkat
Bob

21
@ MichaelKjörling etmeyin cevapları uyacak şekilde geriye dönük soruları düzenleyin. Cevaplardan biri OP'nin sorusunun parçalanma kısmını ele alıyor. Karışıklığı önlemek için düzenlemenizin geri alınması gerekiyor.
DanteTheEgregore

5
@DanteTheEgregore Eğer parçalanmanın etkilerini tartışmak için düzenlenmiş Bob'un cevabına atıfta bulunuyorsanız, silahı atlamadan önce, lütfen bu cevap ve sorudaki düzenleme tarihçelerini ve zaman damgalarını kontrol edin. Düzenlememin yapıldığı sırada Bob'un cevabı, parçalanma meselesini hiç kapsamıyordu. OP bunu yapmak istiyorsa, "ortamı birleştirmek bana bu konuda yardımcı olur mu?" Her ne kadar ayrı bir soru olarak daha iyi sorulduğunu hissetmeme rağmen, her türlü olağanüstü karışıklığı çözmeliyim ; IMO, iki değer arasındaki fark meselesi ile ilişkili değildir.
Bir CVn

11
Bana bu uygulama ciddi bir şekilde kötü programlanmış gibi görünüyor - bir hata raporu dosyalama düşünün. Hiçbir şekilde profesyonel bir programcı değilim, ama bir keresinde JavaME'de benzer bir şeyi hackledim ve tabii ki çözmem gereken sorunlardan biri de tüm bu küçük harita döşemelerini verimli bir şekilde (depolama ve erişim) bir konteynere nasıl saklayacağım. Sıkıştırılmamış zip dosyaları kullanarak sona erdi.
A. Donda

Yanıtlar:


303

Burada FAT / FAT32 dosya sistemini kullandığınızı varsayacağım, çünkü bunun bir SD kart olduğunu söylüyorsunuz. NTFS ve exFAT, tahsis birimleri bakımından benzer şekilde davranır. Diğer dosya sistemleri farklı olabilir, ancak yine de Windows'ta desteklenmiyorlar.

Çok sayıda küçük dosyanız varsa, bu kesinlikle mümkündür. Bunu düşün:

  • 50.000 dosya.

  • FAT32 için maksimum olan 32 kB küme boyutu (ayırma birimi)

Tamam, şimdi alınan minimum alan 50,000 * 32,000 = 1,6 GB'dir (matematiği basitleştirmek için SI öneklerini kullanarak, ikili değil). Her bir dosyanın diskte aldığı alan her zaman ayırma birimi boyutunun bir katıdır - ve burada her dosyanın boşa harcanan (boşa harcanan) bir alan içine sığacak kadar küçük olduğunu varsayıyoruz.

Her bir dosya ortalama 2 KB ise, toplam 100 MB alırsınız - ancak tahsis birim büyüklüğü nedeniyle ortalama olarak 15x (dosya başına 30 KB) harcıyorsunuz.


Derinlemesine açıklama

Bu neden oluyor? Peki, FAT32 dosya sisteminin her bir dosyanın bulunduğu yeri izlemesi gerekir. Her bir baytın bir listesini tutacak olsaydı, tablo (bir adres defteri gibi) verilerle aynı hızda büyür ve boşa harcardı. Bu yüzden yaptıkları şey, "küme boyutu" olarak da bilinen "ayırma birimleri" ni kullanmaktır. Birim bu ayırma birimlerine ayrılmıştır ve dosya sistemi söz konusu olduğunda alt bölümlere bölünemezler - bunlar ele alabileceği en küçük bloklardır. Tıpkı bir ev numaranız gibi, ancak postaneniz kaç tane yatak odasına sahip olduğunuzu veya içlerinde kimin yaşadığını umursamıyor.

Peki, çok küçük bir dosyanız varsa ne olacak? Peki, dosya sistemi 0 kB, 2 kB veya 15 kB olsa bile umursamıyor, elinden geldiğince az yer verecek - yukarıdaki örnekte, bu 32 kB. Dosyanız bu alanın yalnızca küçük bir kısmını kullanıyor ve geri kalanı temelde boşa harcanıyor, ancak hala dosyaya ait - boş bıraktığınız bir yatak odası gibi.

Neden farklı tahsisat birimleri var? Eh, daha büyük bir masaya sahip olmak (adres defteri, örneğin, John'un 123 Sahte Sokak, 124 Sahte Sokak, 666 Şeytan Şeridi, vb. Bir evin sahibi olduğunu söylemek gibi) veya her birimde (evde) boşa harcanan bir travma haline gelir. Daha büyük dosyalarınız varsa, daha büyük ayırma birimleri kullanmak daha mantıklıdır - çünkü bir dosya diğerlerinin tümü doluncaya kadar yeni bir birim (ev) alamaz. Çok sayıda küçük dosyanız varsa, yine de büyük bir masaya (adres defteri) sahip olacaksınız, bu yüzden onlara küçük birimler (evler) de verebilirsiniz.

Büyük tahsis birimleri, genel kural olarak, çok sayıda küçük dosyanız varsa, çok fazla alan israf edecektir. Genel kullanım için 4 kB'nin üstüne çıkmak için genellikle iyi bir neden yoktur.


Parçalanma?

Parçalanma gelince, parçalanma bu şekilde yer israf etmemelidir. Büyük dosyalar parçalanabilir, yani birden fazla tahsis birimine bölünebilir, ancak her biri bir sonrakine başlamadan önce doldurulmalıdır. Birleştirme, ayırma tablolarında küçük bir alan kazandırabilir, ancak bu sizin sorununuz değil.


Olası çözümler

Gibi gladiator2345 önerdi , bu noktada tek gerçek seçenek onunla yaşamak veya daha küçük yerleşim birimleri ile yeniden biçimlendirmek için vardır.

Kartınız, masa boyutunda daha küçük bir limite sahip olan ve bu nedenle daha büyük bir birime hitap etmek için (32 kB tahsis birimleriyle 2 GB üst limiti olan) daha büyük tahsis birimleri gerektiren FAT16'da formatlanmış olabilir. Kaynak Braiam'ın izniyle . Bu durumda, yine de FAT32 olarak güvenle formatlanabilmelisiniz.


3
Bu kadar ödenmesi gereken minimum tahsisat boyutlarına boşa uzay aslında teknik olarak, "iç parçalanma" denir olabilir o parçalanma suçlu olduğunu söylüyorlar. Ama yine de, herhangi bir "birleştirme" aracının hakkında bir şey yapabileceği bir şey değil.
Hobbs

3
(Daha az teknik, sadece "gevşeklik" denir.)
hobbs

1
Küme boyutları ayrıca maksimum dosya sistemi boyutunu da sınırlandırır. Örneğin, adres alanınız 32 bit ise, toplam ~ 4,29 milyar olası toplam kümeniz olur. Şimdi, NTFS (512 bayt) tarafından desteklenen en küçük küme boyutunu kullanırsanız, maksimum 512 * 2 ^ 32 bayt = 2 GiB olarak adresleyebilirsiniz. 2 GiB'dan fazla veri depolayabilecek bir hacme ihtiyacınız varsa, küme boyutunu artırmanız gerekir. Bunların tümü, kaydetmeye çalıştığınız en büyük dosyadan bağımsızdır, en az sorununuz olan 2 GiB'den daha büyük bir dosyayı saklayamazsınız.
Andon M. Coleman

4 KiB kümeleri, öngörülebilir gelecek için yeterli olacak şekilde, 16 TiB boyutunda bir birimdeki dosyaları adreslemenize izin verecektir.
Andon M. Coleman

1
Küçük dosya arşivi büyük bir dosyaya sıkıştırılabilir.
einpoklum

45

Bu, tek bir dosya halinde sıkıştırmanın / arşivlemenin yardımcı olabileceği durumlardan biridir. Ne Bob onun cevabını sözü doğrudur ama çözüm başka cevaplar da anlaşılacağı gibi diski reformating daha kolay olabilir. Dizini sıkıştırır veya arşivlerseniz (zip, tar veya başka bir yöntem kullanarak), dosya sistemi birkaç küçük dosya yerine tek bir büyük dosyanız olduğunu görür. Sıkıştırmadan bile geri alanın 1,4 GiB'sini geri alacaksınız çünkü tüm bu "küçük dosyalar" tek bir büyük dosya olarak sayılacak.

Bunun içinde haritalar uygulamam önbelleğe alınmış haritaları saklar ve uygulama haritasını Google Haritalar'dan alır.

Belki bir arşiv veya birden fazla dosya yerine bir veritabanı kullanmak için geliştirici ile konuşmalısınız. Bu muhtemelen diskin daha az parçalanmasına da yardımcı olacak ve özellikle bir NAND flash sürücüsü ise mutlaka yerden tasarruf sağlayacaktır. 100 MB yük / faydalı verinin 1,4 GB olduğu saçma durumu açıklarsanız, verilerin nasıl depolandığı konusunda yanlış bir şey var ve geliştiriciler daha iyi bir çözüm getirmeli.


1
> Bunun içinde haritalar uygulamam önbelleğe alınmış haritalarını saklar ve uygulama haritasını Google Haritalar'dan alır. - maalesef, bu durumda, sıkıştırma (etkin bir şekilde tabanın üstünde bir dosya sistemidir), bu haritalama uygulamasından destek gerektirir.
Bob

1
@Bob daha sonra çözüm geliştirici tarafında D
gelmelidir

4
Bu tamamen doğru. Bence şu an uygulamamı değiştirmeliyim.
vfsoraki

17
@Braiam Sadece bir dosya olduğunu düşünerek dosya sistemini kandırmak değil; Orada ise sadece bir dosya. Geliştiricilerin önbellek bilgilerini bir arşivde saklamamalarına gelince, bunun nedeni çoğu arşiv biçiminin, bir önbelleğin gerçekten ihtiyaç duyduğu hızlı rastgele yazmalar için tasarlanmamış olmasıdır. SQLite gibi hafif bir veritabanı kütüphanesini kullanmak daha iyi bir alternatif olabilir.
bcrist

1
Kesinlikle doğru ..... +1
arundevma

25

Herhangi birinin bu sorunla karşı karşıya kalması durumunda, diskteki dosya boyutunda / alandaki büyük farklılığı görmenin başka bir nedeninin, alternatif veri akışlarının (ADS) kullanılması olduğunu bilmek faydalı olabilir.

Bu sadece benim bilgime NTFS için geçerlidir. ADS, hem meşru hem de meşru kullanımlarla tanınır:

  • Internet'ten indirilen bir dosyayı etiketlemek için
  • meta verileri depolamak için (Microsoft, bir dosyanın türünü belirlemek için dosya uzantısını kullanmamak gibi Apple işletim sisteminin bazı özelliklerini dahil etmek istedi)
  • Bir malware bağlamında veri veya kod gizlemek için .

ADS basitçe: herhangi bir NTFS dosyası birden fazla veri akışına sahip olabilir ("alt dosyaları" anlayın). Biri, Windows Gezgini ve diğer Windows araçları tarafından kullanılan ana akış olup, bir dosyanın olağan içeriğini tutar. Alternatif veri akışları, tam olarak ana akış olarak başka bilgiler içerebilir, ancak bunlar doğrudan Windows araçları tarafından ele alınamaz (özellikle Explorer, ADS'nin boyutuna bakılmaksızın ana akış boyutuna eşit olarak dosya boyutunu görüntüler), ADS'yi yazmak, okumak ve bulmak için özel araçlar veya kod kullanmanız gerekir.

Asıl nokta, gözlenen büyük dosya boyutu farklılığı durumunda, ADS olasılığını ve gizli kötü amaçlı yazılımın göz ardı etmemesidir.

Başka bağlantı .

Güvenli bir şekilde ADS ile deneme yapmak için bunu DOS / CMD düzeyinde deneyin ...

Bir dosyanın içeriğini oluşturun ve C'nin kök dizininde gösterin:

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

Sonuç:

C:\> The main data stream

Şimdi aynı yöntemle bir ADS ekleyin, sadece dosya adına ek olarak ADS adını belirtin:

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

Dosyadaki gizli mesajı gizlediniz. Explorer’daki dosya boyutunun ADS "sırrı" na bayt eklediğimiz halde değişmediğini unutmayın.

ADS içeriğini görüntülemeye çalışın:

C:\> type test.txt:secret

Sonuç:

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

CMD type, ADS'nin içeriğini görüntüleyemiyor. Bunun yerine Not Defteri kullanacağız:

notepad test.txt:secret

Not Defteri'nde ADS'nin içeriğini görebiliriz:

The secret message

Masum bir metin dosyasının ADS'sinde tam bir çalıştırılabilir dosyayı da gizleyebilir ve istediğiniz zaman çalıştırabilirsiniz. Servet bilgisayar korsanlarına zarar vermez :-)


Ben kendim bir kazancı değilim, işim çoğunlukla Linux'ta yapılır. Bu çok faydalı oldu. Teşekkür ederim
vfsoraki

4
ADS kullanımını kontrol etmek için Sysinternals'tan Akışlar gibi bir araç kullanmaya değer . Örneğin, bir Windows sisteminde indirilen dosyalar ADS'deki bir kaynakla etiketlenebilir, ancak bu çok küçük ve yer kaplamaz. Normalde dir veya Explorer çıktısında gösterilmez. Blokları alabilir ve araştırdığınız disk kullanım problemini ağırlaştırabilir. .
Adric

19

Sorun, küme boyutundan kaynaklanıyor olabilir.

Microsoft'a göre :

Birimdeki dosyalar veya klasörler için NTFS sıkıştırması kullanmıyorsanız, SIZE ve SIZE ON DISK arasındaki fark, gerekenden daha büyük bir küme boyutundan dolayı boşa harcanır. SIZE ON DISK değerinin SIZE değerine mümkün olduğu kadar yakın olması için optimal bir küme boyutu kullanmaya çalışmalısınız. SIZE ON DISK ve SIZE değeri arasındaki aşırı tutarsızlık, varsayılan küme boyutunun, birime kaydettiğiniz ortalama dosya boyutu için çok büyük olduğunu ve azaltılması gerektiğini gösterir. Bu yalnızca birimi yedekleyerek ve ardından uygun ayırma boyutunu belirtmek için format komutunu ve / a anahtarını kullanarak birimi yeniden biçimlendirerek yapılabilir: IE: format D: /a:2048 (Bu örnek 2 KB'lik bir küme boyutu kullanır).

Sürücünüzü daha küçük küme boyutuyla biçimlendirmeyi deneyin.


4
Birinin küme büyüklüğünün 4096 bayttan daha küçük olmamasına veya bu sayının çoğunun olmamasına dikkat edilmesi gerekir. 32 bit işletim sistemi (PAE dışında) 4096 bayt olan sayfalarla çalışır, bu nedenle çoklu olmayan kümelerin kullanılması dosya sistemi performansını olumsuz etkileyebilir. Bu nedenle varsayılan boyut 4096 bayta ayarlanmıştır.
Ruslan

2
@Ruslan'ın söylediğine ek olarak, daha yeni sabit sürücüler artık 4 kB sektör boyutuna sahip ve dosya sistemini fiziksel sektörlerle hizalamak ve tahsis birimi boyutu olarak fiziksel sektör boyutunun bir katına sahip olmak en uygun olacaktır.
Bob

1
@Ruslan Ben iki kez 4096. 12288 (3 × 4096) ve 20480 (5 × 4096) bir güç olması gerektiğini söylemek demek istediğini düşünüyorum.
Scott

9

Diskinizi daha küçük bir küme boyutunda yeniden biçimlendirmeyi öneren birçok insan görüyorum. Bu bir SD kart olduğundan, birçok üreticinin NAND'ın küme boyutuna uyacak şekilde kartı önerilen küme boyutuna önceden biçimlendirdiğini unutmayın (her ikisini de senkronize tutmak en iyi okuma / yazma performansı ve aşınmayı azaltmak için çok önemlidir)

NAND'ın küme boyutunu değiştiremezsiniz (SD kartınızın donanımının fiziksel bir özelliğidir).

Öncelikle rapor probleminin bozuk bir dosya sistemi içerisinde olmadığından emin olmak için önce SD kartınızdaki scandisk / chkdsk komutunu çalıştırın.

İkincisi, hatayı Google Map devs’e rapor etmenizi öneririm, çünkü burada suçlayacaklardı. Üstün bir depolama yöntemi kullanıyor olmalılar. Bunun düzeltilmesi, uygulamanın daha az G / Ç ve dosya sisteminin sürücü etkinliği nedeniyle birçok cihazda daha hızlı çalışmasını sağlamalıdır.


Aslında Google Haritalar değil, Google haritalarını kullanan başka bir uygulama idi. Geliştiriciye bilgi verdim ve bu dosyaları SD kartımdan yeni çıkardım.
vfsoraki

7

Bu, birçok dosya sistemiyle ilgili genel bir sorundur. Burada işte iki faktör vardır, bir dosya sisteminin mantıksal birimler ve depolama ortamının fiziksel kısıtlamaları başına işleyebileceği maksimum "blok" sayısı. Herhangi bir bloğa yalnızca 1 dosya atanabilir (dosyalar genellikle ihtiyaç duyduğu kadar blok alır). Bu nedenle, 64 baytlık bir metin dosyası, bulunduğu dosya sisteminin blok boyutuna bağlı olarak genellikle 4k'dan 32k'ya kadar her şeyi alabilir.

Bunu düşünmenin bir yolu, dosya sistemindeki her bir bloğu bir kutu ve dosya sistemini bir oda olarak düşünmektir. Tüm kutularınız aynı büyüklüktedir ve bir odaya toplayabildiğiniz kadar sığmaya çalışırsınız. Hepsine daha fazla yer kalacak şekilde yerleştirirseniz, odanın tamamen kutularla dolu olması için daha büyük kutular almanız gerekir.

Eşyaları kutulara koymanın kurallarından biri, ilişkisiz iki şeyi kutuya koyamazsınız. Aynı belgenin bir parçası olmak zorundalar. Öyleyse bir sayfa metin yazacak olsaydım, kendine ait bir kutusu olurdu. Yazılan metnim çok fazla sayfa içeriyorsa, hepsini bir kutuya sığdıramazsam, başka bir kutu bulur ve yerine sayfalar koymaya devam eder, tüm sayfalarımı dosyalayana kadar tekrar ederdim. Ayrıca bu belge için kullandığım kutuları ve sırayla okumak için kutuların sırasını da yazdım.

Kutuları nasıl düzenleyeceğime bağlı olarak, tezahürümde yalnızca belirli sayıda kutu için yeterli yer olabilir. Bu yüzden doldurmak için büyük bir odam olsaydı, ancak sadece az sayıda kutuyu oda büyüklüğüne ulaşmak için çok büyük kutular kullanmak zorunda kalırdım.

Bu durumda, bir sayfamda belge hala tek bir kutuyu işgal eder, başka bir şey paylaşmaz.

Aynı durumlar çeşitli depolama çözümleri arasında da geçerlidir. FAT32, günümüzün büyük sabit disklerinde yalnızca düşük sayıda "kutu" olarak kabul edilenleri yönetebilir, bu nedenle bunu telafi etmek için çok büyük "kutular" ile biter.


6

Küme boyutlarının yanı sıra, aşağıdaki koşullar nedeniyle bir tutarsızlığa da sahip olabilirsiniz:

  • Sıkıştırılmış veya şifrelenmiş dosyalar, mantıksal dosya boyutundan farklı bir alan kullanabilir.
  • Bağlantılı dosyalar n sayısını, mantıksal dosya boyutu için dosyanın boyutunun çarpı çarpı sayısını bildirir , ancak kullanılan fiziksel alan genellikle daha azdır.

Genel olarak, bu doğru olabilir. Ancak benim durumumda, yüksek tahsisat birimi sorun oldu.
vfsoraki

3
Yup Ben sadece tutarsızlık için daha olası nedenleri vererek cevaba eklemeye çalışıyorum.
Arşimet Trajano

6

Wikipedia'daki Block Suballocation girişine bir göz atmalısınız. Bu tam olarak size olan şey. Tail Packaging destekli bir dosya sistemi kullanmak, tahsis kümesinin boyutunu değiştirmenin yanı sıra bu sorun için bir dosya sistemi düzeyinde bir çözümdür.

Hepsinin diski yeniden biçimlendirmeye ihtiyaç duyması sakıncalı.

Bazı durumlarda bu dosyaları yalnızca bir arşive depolamak sorunu çözecektir (ve küçük dosyalar da dosyaların sonunda yer kaybetmeyi bırakmanın yanı sıra sıkıştırılır). Bu, dekompresyon için biraz zaman harcamayı zorlaştırmaktadır.

Belirli bir uygulama ile ilgili sorun nedeniyle bu kadar çok küçük dosyanız varsa, başka bir yöntem kullanarak yazılım verilerinizi (bir veritabanında olabilir) depolamak mümkündür. Ama elbette programcılar için bir çözümdür, son kullanıcılar için değil.

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


0

Windows 10'daki büyük dosya boyutu tutarsızlıklarını tek bir dosyada belirttim, ancak SAME dosyasının özelliklerine aynı konumdan (bir ağ sürücüsü) bakarsam, Windows XP'de büyük farklılıklar yok; Beklediğiniz gibi sadece küçük bir fark. Windows 10'da bir hata olduğunu düşünüyorum. 449MB'lık bir dosya muhtemelen Windows 10'un söylediği 3.99GB'ı almıyor.


1
Sadece bir Bilginize, soru pencereleri 7. kullanıyor, Windows 10. OP ile hiçbir ilgisi yoktur
TheKB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.