Tüm dosyaları bir dizine koymak mümkündür, ancak bu bazen biraz daha büyük olabilir. Birçok dosya sisteminin bir sınırı vardır . USB bellekte FAT32 formatlı bir sürücüye git deposu koymak ister misiniz? Yalnızca 65.535 dosyayı tek bir dizinde saklayabilirsiniz. Bu, dizin yapısını tek bir dizinin doldurulmasının daha az olası olacağı şekilde bölmenin gerekli olduğu anlamına gelir.
Bu, diğer dosya sistemlerinde ve daha büyük git depolarında da sorun olabilir. Takıldığım nispeten küçük bir git deposu (yaklaşık 360MiB) ve 11k dosyaları için 181.546 nesnesi var. Linux deposunu çekin, 4.374.054 nesneye sahipsiniz. Bunları tek bir dizine koyacak olsaydınız, dosya sistemini kontrol etmek ve çökmek (bir miktar 'kilitlenme' anlamında) imkansız olurdu.
Yani? Bayt ile ayırdın. FireFox gibi uygulamalarla da benzer yaklaşımlar yapılmaktadır:
~/Li/Ca/Fi/Pr/7a/Cache $ ls
0/ 4/ 8/ C/ _CACHE_001_
1/ 5/ 9/ D/ _CACHE_002_
2/ 6/ A/ E/ _CACHE_003_
3/ 7/ B/ F/ _CACHE_MAP_
Bunun ötesinde, aynı zamanda bir performans sorununa gider. Sayısız Uzun Dosya Adı ile NTFS Performansını Düşünün :
Windows NT, tek bir dizinde uzun dosya adlarına (8.3 kurallarına uymayan adlar) sahip çok sayıda dosya içeren Windows NT dosya sistemi (NTFS) biçimli sürücülerinde dizin işlemlerini gerçekleştirmek için uzun zaman alır.
NTFS bir dizindeki dosyaları sıraladığında, uzun dosya adlarıyla ilişkili 8.3 adı bulmalıdır. Bir NTFS dizini, sıralanmış bir durumda tutulduğundan, karşılık gelen uzun dosya adları ve 8.3 adları, dizin listesinde genellikle yan yana değildir. Bu nedenle, NTFS mevcut her dosya için dizinde doğrusal bir arama kullanır. Sonuç olarak, bir dizin listesini gerçekleştirmek için gereken süre, dizindeki dosya sayısının karesiyle birlikte artar. Az sayıda dosya için (birkaç yüzden az) zaman gecikmesi ihmal edilebilir düzeydedir. Ancak bir dizindeki dosya sayısı birkaç bine yükseldikçe, bir listeyi gerçekleştirmek için gereken süre dakikalara, saatlere ve hatta günlere yükselebilir. Uzun dosya adları birbirine çok benzerse sorun daha da kötüleşir - sadece son birkaç karakterden farklıdır.
SHA1 sağlama toplamından sonra adlandırılmış dosyalarda, bu felaket ve berbat performans için bir reçete olabilir.
(Ve NTFS 1.2 - Yaygın erken 2000'lere 1995 kullanılır) Yukarıdaki Windows NT 3.5 bir teknoloji nottan iken bu da örneğin şeylere görülebilir EXT3'e ile bağlantılı listeleri olma dosya sisteminin uygulamaları O (n) gerektiren arama . Ve o B-ağacı değişikliğinde bile:
HTree algoritması arama sürelerini önemli ölçüde iyileştirirken, readdir () işlevini kullanan iş yükleri için büyük bir dizindeki tüm dosyaların bazı işlemlerini gerçekleştirmek için bazı performans gerilimlerine neden olabilir.
...
Daniel Phillips ve Andreas Dilger tarafından önerilen, ancak henüz uygulanmamış olan bu performans sorununu hafifletmek için olası bir çözüm, inode numaraları, inode'larını dosya adlarının karma değerlerine göre gruplayan bir özelliğe sahip olan serbest inodeları seçmeyi içerir. Daniel ve Andreas, inode'yu dizinin büyüklüğüne göre bir inode aralığından ayırmayı ve sonra da dosya adı karma değerini temel alarak o aralıktan bir inode seçmeyi önerir. Bu teorik olarak, readdir sırasına dizinde belirtilen inode'lara erişirken ortaya çıkan yığılma miktarını azaltmalıdır. Bununla birlikte, bu stratejinin hızlanmaya neden olacağı açık değildir; aslında, başvuruda bulunulması gerekebilecek toplam inode bloğu sayısını artırabilir ve bu nedenle readdir () + stat () iş yüklerinin performansını daha da kötüleştirebilir. Açıkça,
Bu arada, performansın nasıl artırılacağı konusundaki bu bit 2005'ten itibaren gitti, aynı yıl serbest bırakıldı.
Firefox'ta ve çok sayıda karma önbelleğe alınmış dosya içeren birçok uygulamada görüldüğü gibi, önbelleği baytla bölme tasarımı. Bu, ihmal edilebilir bir performans maliyetine sahiptir ve eski tarafta biraz olabilen sistemler ile çapraz platform kullanıldığında, programın çalışıp çalışmadığı arasındaki fark çok iyi olabilir.