Quanti file in una directory sono troppi? (Download dei dati dalla rete)


19

Saluti,

Sto scrivendo alcuni script per elaborare immagini da vari siti Web di foto. In questo momento sto archiviando tutti questi dati in singoli file di testo nella stessa directory.

La directory è accessibile dal web. Un utente finale effettua una chiamata a un servizio Web che restituisce il percorso al file necessario all'utente.

Mi chiedevo in quale fase avrei visto un impatto sulle prestazioni avendo tutti questi file nella stessa directory? (Se presente)



Risposte:


12

Le prestazioni variano in base al filesystem che stai utilizzando.

  • GRASSO: dimenticalo :) (ok, penso che il limite sia di 512 file per directory)
  • NTFS: Sebbene possa contenere 4 miliardi di file per cartella, si degrada relativamente rapidamente - circa un migliaio inizierai a notare problemi di prestazioni, diverse migliaia e vedrai che Explorer si bloccherà per un po '.
  • EXT3: il limite fisico è di 32.000 file, ma perf soffre anche dopo diverse migliaia di file.

  • EXT4: teoricamente illimitato

  • ReiserFS, XFS, JFS, BTRFS: questi sono i buoni per molti file in una directory poiché sono più moderni e progettati per gestire molti file (gli altri sono stati progettati ai tempi in cui gli HDD venivano misurati in MB e non in GB) . Le prestazioni sono molto migliori per molti file (insieme a ext4) in quanto entrambi utilizzano un algoritmo di tipo binario di ricerca per ottenere il file desiderato (gli altri ne usano uno più lineare).


6
Questo è sbagliato. Non esiste un limite di 32000 file in EXT3. Esiste un limite di 32000 sottodirectory. Ho una directory qui con oltre 300000 file e funziona benissimo.
davidsheldon,

1
abbastanza vero - il limite del file è il limite dell'intero filesystem sugli inode, ma sei limitato a 32k link (cioè sottodir).
gbjbaanb,

Anche la dichiarazione per NTFS corrente non è vera, può contenere fino a 4.294.967.295 (2 ^ 32 - 1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder

NON confondere le sottodirectory con i file, sulla macchina CentOS avevo 32000 sottodirectory, ho raggiunto il limite, ho spostato tutti i FILE in quella directory e funziona ancora bene.
adrianTNT


8

Memorizzo le immagini per la pubblicazione su un server Web e ho oltre 300.000 immagini in una directory su EXT3. Non vedo problemi di prestazioni. Prima di configurarlo, ho fatto dei test con 500k immagini in una directory, e accedendo casualmente ai file per nome, e non ci sono stati rallentamenti significativi con 500k su 10k immagini nella directory.

L'unico aspetto negativo che vedo è che per sincronizzare quelli nuovi con un secondo server devo scorrere rsyncl'intera directory e non posso semplicemente dirgli di sincronizzare una sottodirectory contenente le migliaia più recenti.


Bene, per sincronizzare con un secondo server penso che sia necessario creare una struttura e un algoritmo che mantenga le modifiche, quindi questo registro può farti risparmiare un sacco di tempo.
Bahadir Tasdemir,

+1 Questo in realtà risponde alla domanda.
Kubanczyk,

Un aspetto negativo, se si utilizza un client FTP come FileZilla e si desidera elencare il contenuto della cartella, ci vuole un po 'di tempo.
Kai Noack,

3

La quantità di file in una cartella potrebbe teoricamente essere illimitata. Tuttavia, ogni volta che il sistema operativo accederà alla cartella specifica per cercare i file, dovrà elaborare tutti i file nella cartella. Con meno di 500 file, potresti non notare alcun ritardo. Ma quando hai decine di migliaia di file in una singola cartella, un semplice comando dell'elenco cartelle (ls o dir) potrebbe richiedere troppo tempo. Quando è possibile accedere a queste cartelle tramite FTP, sarà davvero troppo lento ...

I problemi di prestazioni non dipenderanno realmente dal sistema operativo, ma dalla velocità del processore del sistema, dalle capacità del disco e dalla memoria. Se hai molti file, potresti volerli combinare in un singolo archivio e utilizzare un sistema di archiviazione ottimizzato per contenere molti dati. Questo potrebbe essere un file ZIP ma, ancora meglio, archiviarli come BLOB in un database con il nome del file come chiave primaria.


Ma l'accesso al file rimuoverà direttamente i colli di bottiglia con le directory di ricerca o accedendo direttamente a una chiamata di ricerca sottostante? (Linux, debian)
steve

3
L'accesso diretto al file mitigherà questi problemi. Ho fatto dei test su ext3 e l'accesso a un file per nome in una directory contenente 500000 file non è significativamente più lento di uno contenente 1000. Ovviamente fare un lsè un problema.
davidsheldon

Quando si conosce il nome esatto, l'accesso dovrebbe essere veloce. Il problema sarebbe principalmente qualsiasi codice o comando che desideri ottenere un elenco di file.
Wim dieci Brink

1

La mia regola empirica è quella di dividere le cartelle se ci sono più di 1000 file e la cartella verrà sfogliata (cioè attraverso Internet o Explorer) o 5000 file altrimenti.


0

Come sottolinea @skaffman, i limiti dipendono dal sistema operativo. È probabile che tu sia interessato da limiti sui sistemi operativi precedenti. Ricordo che una vecchia versione di Solaris era limitata a 32768 file per directory.

La solita soluzione è quella di utilizzare una sorta di hashing, ovvero il server imap di Cyrus divide gli utenti con un hash alfabetico:

/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
Grazie, avrei sicuramente messo a posto qualcosa quando una directory ha più di 2k file! :)
steve

Questa domanda ha alcune buone risposte: serverfault.com/questions/95444/…
davey

La mia regola generale è che oltre 20.000 file in una directory non sono una buona idea. La maggior parte dei filesystem moderni funziona bene con così tanti file. Dopo aver colpito 32k file in una directory, alcuni filesystem come ext3 iniziano a presentare seri problemi di prestazioni.
Phil Hollenback,

Phil - hai qualche informazione sui problemi di prestazioni con oltre 32k file con ext3, al momento non ne vedo nessuno con oltre 300k Forse è qualcosa che non influisce sul mio modello di utilizzo.
davidsheldon

Nel mio lavoro precedente il software scientifico avrebbe generato molti file piccoli (pochi k ciascuno) in una directory. Abbiamo sicuramente visto che per> 32k file i tempi di lettura della directory sarebbero aumentati enormemente. Basta eseguire 'ls' in una directory con quel numero di file richiederebbe un minuto o più.
Phil Hollenback,

0

Se si accede direttamente a un file, il numero di file in una directory non è un problema di velocità.

Il numero di file che è possibile creare in una singola directory dipende dal file system che si sta utilizzando. Se stai elencando tutti i file nella directory o stai cercando, ordinando, ecc. Molti file rallenteranno tali operazioni.

gbjbaanb ha torto nella sua risposta sulla dimensione massima del file ext3. Generalmente ext limita il numero di file sul tuo disco in generale. Non puoi creare più file quindi hai degli inode nella tabella degli inode. Ha ragione nel suggerire reiserfs per maggiori prestazioni con molti file


0

Cartella controllata con file 10K in NTFS (Windows 7, 64 bit). La cartella con 10K immagini in qualsiasi vista (Elenco, Icona, ecc.) Funziona e scorre senza alcun ritardo ragionevole.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.