Bir klasöre çok sayıda (10 milyon) dosya yerleştirme


17

Siteme bir Ubuntu Sunucusu üzerinde çalışan bir tahmini arama özelliği (aşağıdaki örneğe bakın) ekledim. Bu doğrudan bir veritabanından çalışır. Her arama için sonucu önbelleğe almak ve varsa, başka oluşturmak için kullanmak istiyorum.

Potansiyel cira 10 milyon sonuçlarını tek bir dizinde ayrı dosyalara kaydetmemde herhangi bir sorun olur mu? Yoksa bunları klasörlere ayırmanız önerilir mi?

Misal:


5
Bölmek daha iyi olurdu. Bu dizinin içeriğini listelemeye çalışan herhangi bir komut büyük olasılıkla kendini vurmaya karar verecektir.
muru

8
Eğer zaten bir veritabanınız varsa, neden kullanmıyorsunuz? DBMS, dosya sistemine karşı milyonlarca kaydı daha iyi işleyebileceğinden eminim. Dosya sistemini kullanmaya karar verdiyseniz, bir çeşit karma kullanarak bir bölme şeması bulmanız gerekir, bu noktada IMHO, DB'yi kullanmak daha az iş gibi görünecektir.
roadmr

3
Modelinize daha uygun önbellekleme için başka bir seçenek de memcached veya redis olabilir. Anahtar değer depolarıdır (tek bir dizin gibi davranırlar ve öğelere yalnızca adıyla erişirsiniz). Yeniden gönderme kalıcıdır (yeniden başlatıldığında verileri kaybetmez); burada memcached daha geçici öğeler içindir.
Stephen Ostermiller

2
Burada tavuk ve yumurta problemi var. Araç geliştiricileri çok sayıda dosya içeren dizinleri işlemez, çünkü insanlar bunu yapmaz. İnsanlar çok sayıda dosyayla dizin oluşturmaz, çünkü araçlar bunu iyi desteklemez. Örneğin bir kerede anlıyorum (ve bunun hala doğru olduğuna inanıyorum), os.listdirpython'da bir jeneratör sürümü yapmak için bir özellik isteği bu nedenle açıkça reddedildi.

Kendi tecrübelerime göre, Linux 2.6'da tek bir dizinde 32 bin dosyanın üzerine giderken kırılma gördüm. Bu noktanın ötesine geçmek mümkündür, ama bunu tavsiye etmem. Sadece birkaç alt dizin katmanına bölün ve çok daha iyi olacak. Şahsen, dizin başına yaklaşık 10.000 ile sınırlandıracağım, bu size 2 katman verecekti.
Wolph

Yanıtlar:


25

Tek bir dizinde yaklaşık 10 milyon sonuç potansiyel olarak kaydetmek için herhangi bir sorun olur mu?

Evet. Muhtemelen daha fazla neden var ama bunlar başımın üstünden gönderebilirim:

  • tune2fsdir_indexbir performans isabeti görmeden önce bir dizinde kabaca 100 bin dosya depolamanızı sağlayan varsayılan olarak açık olma (Ubuntu'da) olarak adlandırılan bir seçeneğe sahiptir . Bu, düşündüğünüz 10m dosyalarına bile yakın değil.

  • extdosya sistemlerinde sabit maksimum sayıda düğüm bulunur. Her dosya ve dizin 1 inode kullanır. df -iBölümlerinizin ve düğümlerinizin ücretsiz bir görünümü için kullanın . Düğümleriniz bittiğinde yeni dosya veya klasör oluşturamazsınız.

  • joker karakterler gibi rmve lskullanırken komutlar komutu genişletir ve "argüman listesi çok uzun" olur. findDosyaları silmek veya listelemek için kullanmanız gerekir. Ve findyavaş olma eğilimindedir.

Yoksa bunları klasörlere ayırmanız önerilir mi?

Evet. Kesinlikle. Temel olarak 1 dizinde 10m dosyaları bile saklayamazsınız.

Veritabanını kullanırdım. Bir web sitesi için önbellek istiyorsanız " solr " ("dağıtılmış indeksleme, çoğaltma ve yük dengeli sorgulama sağlayan") bir göz atın .


8

Aynı sorunla sonuçlandı. Her şeyi aynı klasöre yerleştirip birden çok klasöre sahip olup olamayacağınızı öğrenmek için kendi karşılaştırmalarımı çalıştırın. Olabilir ve daha hızlı görünüyor!

Karşılaştırma

Ref: https://medium.com/@hartator/benchmark-deep-directory-sttruc-vs-flat-directory-sttruc-to-store-millions-of-files-on-ext4-cac1000ca28


1
Teşekkürler, bu çok faydalı. Bunu bir sitede kullanıyorum ve bu bölümü /abc/efg.html dizin yapılarına sahip olacak şekilde yeniden programlamak gerçek bir sorun oldu. Bu yüzden gelecekte düz bir dizine geri döneceğim.
Kohjah Breese

0

İkili arama milyonlarca kaydı kolayca işleyebilir, böylece tek bir dizinde arama yapmak sorun olmaz. Çok hızlı olacak.

Temel olarak bir 32 bit sistem kullanıyorsanız, 2Gb kayıtlara kadar ikili arama kolay ve iyidir.

Açık kaynak kodlu bir yazılım olan Berekely DB, tüm sonucu tek bir giriş altında saklamanıza izin verir ve aramayı yerleşik hale getirir.

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.