Bir dizindeki kaç dosya çok fazla? (İnternetten veri indirme)


19

Selamlar,

Çeşitli fotoğraf web sitelerinden görüntüleri işlemek için bazı senaryolar yazıyorum. Şu anda tüm bu verileri aynı dizindeki tek tek metin dosyalarında saklıyorum.

Dizine web'den erişilebilir. Son kullanıcı, kullanıcının ihtiyaç duyacağı dosyanın yolunu döndüren bir web hizmetine çağrı yapar.

Tüm bu dosyaları aynı dizinde tutarak hangi aşamada bir performans etkisi görecektim diye merak ediyordum. (Varsa)



Yanıtlar:


12

Performans kullandığınız dosya sistemine göre değişir.

  • FAT: unut gitsin :) (tamam, limitin dizin başına 512 dosya olduğunu düşünüyorum)
  • NTFS: Klasör başına 4 milyar dosya tutabilir, nispeten hızlı bir şekilde bozulur - bin civarında performans sorunlarını fark etmeye başlayacaksınız, birkaç bin ve explorer'ın bir süre beklediğini göreceksiniz.
  • EXT3: fiziksel sınır 32.000 dosyadır, ancak perf birkaç bin dosyadan sonra da acı çeker.

  • EXT4: teorik olarak sınırsız

  • ReiserFS, XFS, JFS, BTRFS: bunlar daha modern oldukları ve birçok dosyayı işlemek için tasarlandıkları için bir dizindeki birçok dosya için iyi olanlardır (diğerleri HDD'lerin GB değil MB olarak ölçüldüğü günlerde tasarlandı) . Her ikisi de istediğiniz dosyayı almak için ikili bir arama türü algoritması kullandığından (diğerleri daha doğrusal olanı kullanır) performans birçok dosya için (ext4 ile birlikte) çok daha iyidir.


6
Bu yanlış. EXT3'te 32000 dosya sınırı yoktur. 32000 alt dizin sınırı vardır. Burada 300.000'den fazla dosya içeren bir dizin var ve iyi çalışıyor.
davidsheldon

1
oldukça doğru - dosya sınırı, tüm dosya sisteminin düğümler üzerindeki sınırıdır, ancak 32 bin bağlantı (yani alt dizinler) ile sınırlısınız.
gbjbaanb

Geçerli NTFS için bildiride de doğru değildir, bu 4294967295 tutabilir (2 ^ 32 - 1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder

Alt dizinleri dosyalarla karıştırmayın, CentOS makinesinde 32000 alt dizinim vardı, sınıra ulaştım, tüm DOSYALARI bir dizine taşıdım ve hala iyi çalışıyor.
adrianTNT


8

Bir web sunucusu tarafından sunulmak üzere görüntüleri saklıyorum ve EXT3'teki bir dizinde 300.000'den fazla görselim var. Performans sorunu görmüyorum. Bunu ayarlamadan önce, bir dizinde 500 bin görüntü ile testler yaptım ve dosyalara adlarına rastgele eriştim ve dizinde 10 bin görüntü üzerinde 500 bin ile önemli bir yavaşlama olmadı.

Gördüğüm tek dezavantajı, yenilerini ikinci bir sunucu ile senkronize etmek için rsynctüm dizini çalıştırmam gerekiyor ve sadece en son binini içeren bir alt dizini senkronize etmesini söyleyemem.


Peki, ikinci bir sunucu ile senkronize etmek için değişiklikleri tutan bir yapı ve algoritma oluşturmanız gerektiğini düşünüyorum, o zaman bu günlük size büyük miktarda zaman kazandırabilir.
Bahadir Tasdemir

+1 Bu aslında soruyu cevaplıyor.
kubanczyk

Tek dezavantajı, FileZilla gibi bir FTP istemcisi kullanıyorsanız ve klasörün içeriğini listelemek istiyorsanız, biraz zaman alır.
Kai Noack

3

Bir klasördeki dosya miktarı teorik olarak sınırsız olabilir. Ancak, işletim sistemi dosyaları aramak için belirli bir klasöre her eriştiğinde, klasördeki tüm dosyaları işlemek zorunda kalacaktır. 500'den az dosyayla gecikmeler fark etmeyebilirsiniz. Ancak, tek bir klasörde on binlerce dosya olduğunda, basit bir klasör listesi komutu (ls veya dir) çok uzun sürebilir. Bu klasörlere FTP üzerinden erişilebildiğinde, gerçekten çok yavaş olacaktır ...

Performans sorunları gerçekten işletim sisteminize değil, sistem işlemcinizin hızına, disk kapasitelerine ve belleğe bağlıdır. Bu kadar çok dosyanız varsa, bunları tek bir arşivde birleştirmek ve çok fazla veri tutmak için optimize edilmiş bir arşivleme sistemi kullanmak isteyebilirsiniz. Bu bir ZIP dosyası olabilir, ancak daha iyisi, birincil anahtar olarak dosya adına sahip bir veritabanında blob olarak saklayın.


Ancak dosyaya erişmek, arama dizinleriyle doğrudan darboğazları kaldıracak mı yoksa bir directy'ye erişmenin hala temel bir arama çağrısı var mı? (Linux, debian)
steve

3
Dosyaya doğrudan erişmek bu sorunları azaltacaktır. Ext3 üzerinde testler yaptım ve 500000 dosya içeren bir dizinde bir dosyaya adla erişmek 1000 içeren bir dosyadan önemli ölçüde yavaş değil. Açıkçası lsbir sorun yapıyor .
davidsheldon

Tam adı bildiğinizde erişim hızlı olmalıdır. Sorun çoğunlukla dosyaların bir listesini almak isteyen herhangi bir kod veya komut olabilir.
On Brink

1

Temel kuralım 1000'den fazla dosya varsa ve klasöre göz atılacaksa (yani internet veya Explorer aracılığıyla) veya 5000 dosyaya bölünmek.


0

@Skaffman'ın belirttiği gibi, limitler işletim sistemine bağlıdır. Eski işletim sistemlerindeki sınırlardan etkilenme olasılığınız yüksektir. Solaris'in eski bir sürümünün dizin başına 32768 dosya ile sınırlı olduğunu hatırlıyorum.

Genel çözüm bir çeşit karma kullanmaktır, yani Cyrus imap sunucusu kullanıcıları alfabetik bir karma ile ayırır:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/

1
Teşekkürler, bir dir 2k dosyaları daha sonra bir kez kesinlikle yerinde bir şey olurdu! :)
steve

Bu sorunun bazı iyi cevapları vardır: serverfault.com/questions/95444/…
davey

Genel kuralım, bir dizindeki yaklaşık 20.000'den fazla dosyanın iyi bir fikir olmamasıdır. Modern dosya sistemlerinin çoğu bu kadar dosya ile uyumludur. Bir dizinde 32k dosyaya çarptığınızda, ext3 gibi bazı dosya sistemleri ciddi performans sorunları yaşamaya başlayacaktır.
Phil Hollenback

Phil - ext3 ile 32k'den fazla dosya ile performans sorunları hakkında herhangi bir bilgi var mı, şu anda 300k üzerinde ile herhangi bir görmüyorum Belki de benim kullanım desen etkilemez bir şey.
davidsheldon

Bir önceki işimde bilimsel yazılım bir dizinde çok sayıda küçük (her biri birkaç k) dosya oluşturacaktı. Biz kesinlikle gördüm> 32k dosyaları dizini okuma süreleri çok ateş. Sadece 'ls' çalıştırmak bir dizinde bu kadar çok dosya ile bir dakika veya daha fazla sürer.
Phil Hollenback

0

Bir dosyaya doğrudan erişiyorsanız, bir dizindeki dosya sayısı hız sorunu oluşturmaz.

Tek bir dizinde oluşturabileceğiniz dosya sayısı, kullandığınız dosya sistemine bağlıdır. Dizindeki tüm dosyaları listeliyorsanız veya çok sayıda dosyanın bulunması, arama, sıralama vb. Yapıyorsanız bu işlemler yavaşlar.

gbjbaanb, ext3'ün maksimum dosya boyutu hakkındaki cevabında yanlış. Genellikle ext, diskinizdeki dosya sayısını genel olarak sınırlar. Daha fazla dosya oluşturamazsanız, inode tablonuzda inodeunuz olur. Birçok dosyada daha fazla performans için reiserfs önermede doğrudur


0

NTFS'de (Windows 7, 64 bit) 10K dosya içeren işaretli klasör. Herhangi bir görünümde (Liste, Simge vb.) 10K görüntüler içeren klasör, herhangi bir makul gecikme olmadan çalışır ve kaydırır.

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.