NTFS performansı ve çok sayıda dosya ve dizin


183

NTFS'li Windows, çok sayıda dosya ve dizinle nasıl çalışır?

Performans sorunları veya diğer sorunlarla karşılaşmadan önce tek bir dizine yerleştirebileceğiniz dosya veya dizin sınırları hakkında herhangi bir rehberlik var mı?

Örneğin içinde 100.000 klasör içeren bir klasör olması iyi bir şey mi?



İlgili sorudaki cevaplar burada kabul edilen cevaptan daha düşüktür.
Eric J.

Bu Uygulama yararlı olabilir: github.com/acrobit/AcroFS
Ghominejad

Yanıtlar:


271

On milyonlarca dosya içeren klasörlere sahip olduğumuz bir ortama sahip birinden bazı öneriler.

  1. Klasör, dizin bilgilerini (alt dosyalara ve alt klasöre bağlantılar) bir dizin dosyasında depolar. Çok fazla çocuğunuz olduğunda bu dosya çok büyüyecek. Klasör olan bir alt öğe ile dosya olan bir alt öğe arasında ayrım yapmadığını unutmayın. Tek fark, o çocuğun içeriği ya çocuğun klasör dizini ya da çocuğun dosya verileridir. Not: Bunu biraz basitleştiriyorum ama bu noktaya değiniyor.
  2. Dizin dosyası parçalanacaktır. Çok parçalandığında, bu klasöre dosya ekleyemezsiniz. Bunun nedeni, izin verilen parça sayısı üzerinde bir sınır olmasıdır. Tasarım gereği. Bir destek olayı çağrısında Microsoft ile onayladım. Bu nedenle, bir klasörde sahip olabileceğiniz dosya sayısı için teorik sınır birkaç milyar olsa da, ilk önce parçalanma sınırına vuracağınız için on milyonlarca dosyaya bastığınızda iyi şanslar.
  3. Ancak hepsi kötü değil. Bu dizini birleştirmek için aracı: contig.exe kullanabilirsiniz. Dizinin boyutunu azaltmaz (onlarca milyon dosya için birkaç konsere ulaşabilir), ancak parça sayısını azaltabilirsiniz. Not: Disk Birleştirme aracı klasörün dizinini BİRLEŞTİRMEZ. Dosya verilerini birleştirir. Yalnızca contig.exe aracı dizini birleştirir. Bilginize: Tek bir dosyanın verilerini birleştirmek için de kullanabilirsiniz.
  4. Birleştirme işlemi yaparsanız, maksimum parça sayısı sınırına ulaşana kadar beklemeyin. Birleştiremeyeceğim bir klasörüm var çünkü çok geç olana kadar bekledim. Bir sonraki testim, bazı dosyaları o klasörden başka bir klasöre taşımaya çalışmaktır. Bu başarısız olursa, o zaman yapmam gereken 1) yeni bir klasör oluşturmaktır. 2) bir grup dosyayı yeni klasöre taşıyın. 3) yeni klasörü birleştirin. Bu işlem bitene kadar # 2 ve # 3'ü tekrarlayın ve ardından 4) eski klasörü kaldırın ve yeni klasörü eskisiyle eşleşecek şekilde yeniden adlandırın.

Sorunuzu daha doğrudan yanıtlamak için: 100 bin girişe bakıyorsanız endişelenmeyin. Git kendini öldür. On milyonlarca girişe bakıyorsanız:

a) Bunları alt klasörlere ayırmayı planlayın (ör. 100M dosyanız olduğunu varsayalım. 1000 klasörde saklamak daha iyidir, böylece klasör başına yalnızca 100.000 dosya 1 büyük klasöre depolamaktan daha iyidir. maksimum parça sayısı sınırına ulaşma olasılığı daha yüksek olan tek bir büyük dizin yerine 1000 klasör dizini oluşturur veya

b) Büyük klasörün dizinini birleştirmek için contig.exe dosyasını düzenli olarak çalıştırmayı planlayın.

Aşağıda sadece sıkıldıysanız okuyun.

Asıl sınır, parça # üzerinde değil, parçacığa işaretçileri saklayan veri segmentinin kayıt sayısı üzerinde.

Sahip olduğunuz şey, dizin verilerinin parçalarına işaretçiler depolayan bir veri segmentidir. Dizin verileri, dizinin sözde depolandığı alt dizinler ve alt dosyalar hakkında bilgi depolar. Aslında, bir dizin hiçbir şeyi "depolamaz". Depolama ortamının kendisi doğrusal olduğundan, kullanıcıya hiyerarşi yanılsamasını sunan bir izleme ve sunum özelliği.


5
Hakkında daha fazla bilgiyi nereden bulabilirim contig.exe, bu benim sunucumda değil. Bir Google araması , alt dizinlerden veya klasör dizini birleştirmesinden bahsetmeyen bu teknoloji sayfasını döndürdü .
Evan Carroll

35
Bir Microsoft mühendisiyle yapılan bir teknoloji çağrısından devam ve klasör dizini parçalanması hakkında bilgi sahibi oldum. Bu işe yaramaz seviye 1-3 katman teknik destek geçiyor popo büyük bir acı oldu. (Ah ... chkdsk çalıştırmayı denediniz mi? Windows Gezgini'nde klasörü açmayı deneyebilir misiniz? Klasör izinlerini kontrol edebilir misiniz?) FOOL! Burada 7 gün boyunca oturup lanet chkdsk'ınızın on milyonlarca dosya içeren bir sürücüyü taramasını beklemeyeceğim!
MrB

5
@ ss2k - Sadece contig.exebir dizinin üzerine gelin , bu işi yapacak düşünüyorum : contig -a .verir:C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file
Lumi

3
@GPhilo Milyonlarca dosyayı kullanırken performansın SSD'de hala düştüğünü doğrulayabilirim. Ben de klasörü dolandırmak için çalıştı, ama contig ona hiçbir şey yapmadı. Tamamlanmış gibi davrandı, ancak çalıştırmadan önce ve sonra aynı parçalanmayı gösterdi.
Bram Vanroy

1
Contiglere endeksi dolandırmak için çalışan açısından, ben, contig çalıştırmak gerekir c:\my\big\directoryya, c:\my\big\directory\*ya üzerinde $mft? (ya da başka bir şey?)
Stephen R

47

Kısa dosya adı oluşturmada işleri yavaşlatan performans sorunları da vardır. Microsoft, bir klasörde 300 binden fazla dosyanız varsa kısa dosya adı oluşturmayı kapatmanızı önerir [1]. İlk 6 karakter ne kadar az benzersizse, bu da o kadar sorun yaratır.

[1] Nasıl NTFS İşleri gelen http://technet.microsoft.com , "300.000" için arama


3
Buraya bir teklif eklemek istiyorum If you use large numbers of files in an NTFS folder (300,000 or more), disable short-file name generation for better performance, and especially if the first six characters of the long file names are similar.- arama "300.000" ipucu için yedekler. BTW: "300" yazmanız yeterli olacaktır (= burada panoya gerek yok)
Wolf

32

En fazla 2 milyar (2 ^ 32) dosyayı barındıracak bir Dosya Yapısı oluşturuyorum ve Katı Hal Sürücüsünde NTFS Dizini başına yaklaşık 250 Dosya veya 120 Dizinde Gezinme + Okuma Performansında keskin bir düşüş gösteren aşağıdaki testleri gerçekleştirdim ( SSD):

  • Dosya Performansı 250 ile 1000 Dosya arasında% 50 azalır.
  • Dizin Performansı 120 ile 1000 Dizin arasında% 60 azalır.
  • 1000'den büyük Sayılar nispeten sabit kalır

İlginç bir şekilde Dizin ve Dosya Sayısı önemli ölçüde ETKİLEŞMEZ.

Yani Dersler:

  • 250'nin üzerindeki Dosya Numaralarının maliyeti 2'dir
  • 120'nin üzerindeki dizinlerin maliyeti 2,5
  • Windows 7'deki Dosya Gezgini büyük #Dosyaları veya #Dirs'leri işleyebilir, ancak Kullanılabilirlik yine de kötüdür.
  • Alt Dizinlere Giriş Pahalı Değil

Veriler (Her Dosya ve Dizin için 2 Ölçüm):

(FOPS = File Operations per Second)
(DOPS = Directory Operations per Second)

#Files  lg(#)   FOPS    FOPS2   DOPS    DOPS2
   10   1.00    16692   16692   16421   16312
  100   2.00    16425   15943   15738   16031
  120   2.08    15716   16024   15878   16122
  130   2.11    15883   16124   14328   14347
  160   2.20    15978   16184   11325   11128
  200   2.30    16364   16052   9866    9678
  210   2.32    16143   15977   9348    9547
  220   2.34    16290   15909   9094    9038
  230   2.36    16048   15930   9010    9094
  240   2.38    15096   15725   8654    9143
  250   2.40    15453   15548   8872    8472
  260   2.41    14454   15053   8577    8720
  300   2.48    12565   13245   8368    8361
  400   2.60    11159   11462   7671    7574
  500   2.70    10536   10560   7149    7331
 1000   3.00    9092    9509    6569    6693
 2000   3.30    8797    8810    6375    6292
10000   4.00    8084    8228    6210    6194
20000   4.30    8049    8343    5536    6100
50000   4.70    7468    7607    5364    5365

Ve bu Test Kodu:

[TestCase(50000, false, Result = 50000)]
[TestCase(50000, true, Result = 50000)]
public static int TestDirPerformance(int numFilesInDir, bool testDirs) {
    var files = new List<string>();
    var dir = Path.GetTempPath() + "\\Sub\\" + Guid.NewGuid() + "\\";
    Directory.CreateDirectory(dir);
    Console.WriteLine("prepare...");
    const string FILE_NAME = "\\file.txt";
    for (int i = 0; i < numFilesInDir; i++) {
        string filename = dir + Guid.NewGuid();
        if (testDirs) {
            var dirName = filename + "D";
            Directory.CreateDirectory(dirName);
            using (File.Create(dirName + FILE_NAME)) { }
        } else {
            using (File.Create(filename)) { }
        }
        files.Add(filename);
    }
    //Adding 1000 Directories didn't change File Performance
    /*for (int i = 0; i < 1000; i++) {
        string filename = dir + Guid.NewGuid();
        Directory.CreateDirectory(filename + "D");
    }*/
    Console.WriteLine("measure...");
    var r = new Random();
    var sw = new Stopwatch();
    sw.Start();
    int len = 0;
    int count = 0;
    while (sw.ElapsedMilliseconds < 5000) {
        string filename = files[r.Next(files.Count)];
        string text = File.ReadAllText(testDirs ? filename + "D" + FILE_NAME : filename);
        len += text.Length;
        count++;
    }
    Console.WriteLine("{0} File Ops/sec ", count / 5);
    return numFilesInDir; 
}

2
Kısa ad oluşturmayı (8 karakter ad üretme) devre dışı bırakmanız gerektiğinden, 2 ^ 8 dosyadan sonra performans kaybı görüyorsunuz. Bkz. Technet.microsoft.com/tr-tr/library/cc781134(v=ws.10).aspx
Kyle Falconer

1
Merhaba, ben bu Komut Satırı kullanarak denedim: fsutil.exe davranış kümesi devre dışı 8dot3 1 Yeniden başlattıktan sonra sonuçları 10000 dosya / dirs daha az büyük ölçüde aynı idi. Makale, sadece yüksek sayılar için önemli olduğunu söylüyor. Ne gördüm genel bir perf oldu. muhtemelen
SSD'mdeki

çok faydalı, teşekkürler. Diğer kullanıcılar tarafından söylenen milyonlarca tahmin, bu sayısal değerlerden uzaktır.
Adrian Maire

2
Hatta 8.3 adı oluşturulmasını devre dışı bıraktıktan sonra, hala gerek şerit mevcut 8.3 isimleri veya mevcut dosyaların numaralandırma için küçük bir gelişme olacaktır.
Stephen R


15

100.000 iyi olmalı.

Milyonlarca dosyayla sorun yaşayan (anekdotsal olarak) insanları gördüm ve Explorer ile kendimde sorun yaşadım, sadece 60 şeylik bin dosyayı nasıl sayabileceğime dair bir fikrim yok, ancak NTFS konuştuğunuz birimler için iyi olmalı.

Merak ediyorsanız, teknik (ve umarım teorik ) maksimum dosya sayısı: 4.294.967.295


5
Başlatılmayanlar için bu büyük sayı (2 ^ 32 - 1) dosyadır.
meatspace

8

Yerel erişim için çok sayıda dizin / dosya bir sorun gibi görünmemektedir. Ancak, bir ağ üzerinden erişiyorsanız, birkaç yüz sonra göze çarpan bir performans var (özellikle Vista makinelerinden erişildiğinde (NTFS ile Windows Server'dan Windows Server'a çok daha hızlı çalışıyor gibi görünüyordu).


4
Bunun SMFS (ağ düzeyinde) değil NTFS (sunucudaki disk protokolü) olduğundan emin misiniz?
MSalters

Hayır, sebebi daraltmak için daha fazla araştırma yapmadım. Sahip olduğum tek bilgi yukarıda açıklandığı gibidir.
Brian Knoblauch

2

N girişli bir klasör oluşturduğunuzda, dosya sistemi düzeyinde N öğelerin bir listesini oluşturursunuz. Bu liste sistem çapında paylaşılan bir veri yapısıdır. Daha sonra giriş ekleyerek / kaldırarak bu listeyi sürekli olarak değiştirmeye başlarsanız, en azından paylaşılan veriler üzerinde bir miktar kilitlenme olmasını beklerim. Bu çekişme - teorik olarak - performansı olumsuz etkileyebilir.

Salt okunur senaryolar için, çok sayıda girişi olan dizinlerin performans düşüşü için herhangi bir neden düşünemiyorum.


1

Bir çevrimiçi kütüphane kopyalarken bir dizinde NTFS yaklaşık 100 000 dosyaları (her biri birkaç MB) ile gerçek bir deneyim oldu.

Dizinin Explorer veya 7-zip ile açılması yaklaşık 15 dakika sürer.

Site kopyasını yazmak bir winhttracksüre sonra her zaman takılır. Ayrıca, yaklaşık 1000 000 dosya içeren dizinle de ilgilenmiştir. Bence en kötü şey, MFT'nin sadece ardışık olarak geçebilmesidir.

Ext3'de ext2fsd altında aynı şekilde açılması neredeyse aynı zamanlamayı verdi. Muhtemelen reiserfs'e (reiser4fs değil) geçmek yardımcı olabilir.

Bu durumdan kaçınmaya çalışmak muhtemelen en iyisidir.

Kendi programlarınız için bloksuz herhangi bir fs yararlı olabilir. Facebook, fotoğrafları depolamak için böyle yapar.


"MFT sadece ardışık olarak geçebilir" nereden aldığınızdan emin değilim? MFT bir B-ağacı içerir ve bir B-ağacı gibi geçilir
phuclv
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.