Se ci sono come 1.000.000 singoli file (per lo più di 100 k di dimensione) in una singola directory, in modo piatto (nessun'altra directory e file in essi contenuti), ci saranno dei compromessi in termini di efficienza o svantaggi in altri modi possibili?Cosa succede se ci sono troppi file in una singola directory in Linux?
risposta
ARG_MAX sta per prendere problemi con questo ... per esempio, rm -rf * (mentre nella directory) sta per dire "troppi argomenti". Le utility che vogliono fare un qualche tipo di globbing (o una shell) avranno qualche interruzione di funzionalità.
Se tale directory è disponibile al pubblico (diciamo via ftp o server Web), potrebbero verificarsi ulteriori problemi.
L'effetto su qualsiasi dato file system dipende interamente da quel file system. Con che frequenza si accede a questi file, qual è il file system? Ricorda, Linux (per impostazione predefinita) preferisce mantenere i file a cui si accede recentemente in memoria mentre si inseriscono i processi in swap, a seconda delle impostazioni. Questa directory è servita tramite http? Google lo vedrà e lo analizzerà? In tal caso, potrebbe essere necessario regolare la pressione e lo swappiness della cache VFS.
Edit:
ARG_MAX è un limite a livello di sistema per quanti possano essere presentate argomentazioni al punto di ingresso di un programma. Quindi, prendiamo 'rm', e l'esempio "rm -rf *" - la shell girerà '*' in una lista delimitata da spazi di file che a loro volta diventano gli argomenti di 'rm'.
La stessa cosa succederà con ls e molti altri strumenti. Ad esempio, ls foo * potrebbe rompersi se troppi file iniziano con "pippo".
Suggerirei (non importa quale fs è in uso) per suddividerlo in blocchi di directory più piccoli, solo per questo motivo.
Quando esegui accidentalmente "ls" in quella directory, o usi il completamento della tabulazione, o vuoi eseguire "rm *", sarai in grossi guai. Inoltre, potrebbero esserci problemi di prestazioni a seconda del tuo file system.
È consigliabile raggruppare i file in directory che sono denominate dai primi 2 o 3 caratteri dei nomi file, ad es.
aaa/ aaavnj78t93ufjw4390 aaavoj78trewrwrwrwenjk983 aaaz84390842092njk423 ... abc/ abckhr89032423 abcnjjkth29085242nw ... ...
maggior parte delle distribuzioni utilizzano Ext3 per impostazione predefinita, che può utilizzare B-tree indicizzazione per directory di grandi dimensioni. Alcune delle distro hanno questa funzione dir_index
abilitata per impostazione predefinita in altre che dovresti abilitare tu stesso. Se lo abiliti, non ci sono rallentamenti nemmeno per milioni di file.
per vedere se dir_index
funzione è attivata do (come root):
tune2fs -l /dev/sdaX | grep features
Per attivare dir_index funzione (come root):
tune2fs -O dir_index /dev/sdaX
e2fsck -D /dev/sdaX
Sostituire /dev/sdaX
con partizione per la quale si desidera attivare esso.
Là * è * una penalità, la differenza è tra una penalità esponenziale, lineare o logaritmica – dsm
Fai i tuoi numeri. Hai 1mln di file. Con l'indice occorrono N secondi per accedere al file per nome. Ora lo divideresti in 1000 directory con 1000 file ciascuna. Ti bastano N/2 secondi per accedere alla directory, un altro N/2 per accedere al file. Totale N secondi senza contare l'overhead per il cambio di directory. – vartec
La risposta ovvia è che la cartella sarà estremamente difficile da usare per gli umani molto prima di qualsiasi limite tecnico, (il tempo necessario per leggere l'output di ls per uno, sono dozzine di altri motivi) C'è una buona ragione per cui non posso dividere in sottocartelle?
La mia esperienza con grandi directory in ext3 e dir_index
permesso:
- Se si conosce il nome del file che si desidera accedere, non v'è quasi nessuna penalità
- Se si vuole fare operazioni che necessità per leggere l'intera voce della directory (come un semplice
ls
in quella directory) ci vorranno diversi minuti per la prima volta. Quindi la directory rimarrà nella cache del kernel e non ci saranno più penalità - Se il numero di file diventa troppo alto, si incontrano problemi ARG_MAX e altri. Ciò significa in sostanza che il carattere jolly (
*
) non funziona sempre come previsto. Questo è solo se si vuole veramente per eseguire un'operazione su tutti i file in una volta
Senza dir_index
tuttavia, si sta davvero fregato :-D
Non tutti i filesystem sostiene che molti file.
Su alcuni di essi (ext2, ext3, ext4) è molto facile raggiungere il limite di inode.
- 1. Quanti file in una directory sono troppi (su Windows e Linux)?
- 2. Cosa succede se cancello ibdata1 in mysql (LINUX)
- 3. Come eliminare tutti i file che sono stati recentemente creati in una directory in linux?
- 4. perché ci sono più fcntl.h in linux?
- 5. Ci sono troppi asserti in questo test unitario?
- 6. Cosa succede se implemento una classe nel file di intestazione?
- 7. Cosa succede se chiudi una connessione chiusa?
- 8. Cosa succede se nuovo fallisce?
- 9. Cosa succede se voglio implementare una query complicata in REST
- 10. Cosa succede se non si ripristina una transazione in Hibernate?
- 11. Come sapere quando ci sono troppi messaggi di registrazione?
- 12. GKSession: cosa succede se Bluetooth e Wi-Fi sono disattivati?
- 13. Molti file in una directory?
- 14. LINQ: cosa restituisce All() se non ci sono elementi?
- 15. Windows: cosa succede se finisco di scrivere lettere? (sono 26!)
- 16. Git: il repository contiene una directory vuota - cosa succede?
- 17. Cosa succede in BeginProcessRequest()?
- 18. Azure: non ci sono abbonamenti nella directory
- 19. Cosa succede in una doppia eliminazione?
- 20. Come trovare se ci sono nuovi file in una directory ogni 2 minuti nello script di shell?
- 21. Cosa succede se una scrittura su localStorage viene cancellata?
- 22. Quanti sono troppi in <HEAD>?
- 23. In Akka, cosa succede se guardo() un ActorRef guasto?
- 24. Ci sono segnali di sospensione/ripresa in Linux?
- 25. Cosa succede se si compila un file java vuoto?
- 26. Cosa succede se Zookeeper fallisce completamente?
- 27. Cosa sono i file ODEX in Android?
- 28. Cosa succede se JWT viene rubato?
- 29. SVN Checkout una singola directory
- 30. Cosa succede se non chiudi un filehandle in Perl?
Grazie molte Sir :) Questo tuo post mi ha davvero aiutato molto! –