Qualche limitazione per avere molti file in una directory in Mac OS X?


9

Ho oltre 100.000 file in una directory nel mio MacOS X e sembra che il mio script legga un file al loro interno.

C'è qualche limitazione o raccomandazione per avere così tanti file? Devo dividerli in alcune directory?

La limitazione che ho riscontrato è che non posso mv * fooper tutti i 100.000 file. Mostra un errore, dicendo "argomento troppo lungo". Funziona con circa meno di 20.000 file.


Attualmente ho 380.000 file in una directory e mi rendo conto che anche l'apertura di un file richiede solo più di 10 secondi. Ho deciso di separarli in alcune directory.
Daisuki Honey,

1
Il file system HFS + dovrebbe essere in grado di archiviare e accedere a un numero elevato di file in una directory con il loro nome completo senza troppi problemi. Ma devi stare attento con i caratteri jolly. Quando si utilizza *o ?come parte di un argomento per un comando, il sistema operativo cerca nell'intera directory i file corrispondenti (lenti), quindi sostituisce l'argomento con un elenco di tutti i file corrispondenti (lunghi), che passa quindi al comando. Potresti fare di meglio con un loop o con diversi comandi mv, ad es mv a* foo && mv b* foo.
Matthias Fripp,

Risposte:


1

Secondo questa risposta Stack Overflow e dettagli specifici sul sito di Apple , una singola cartella può contenere fino a 2,1 miliardi di articoli.

Detto questo, solo perché può contenere fino a 2,1 miliardi di articoli non significa che può mantenere le prestazioni a quel livello. Secondo Wikipedia ; l'enfasi è mia:

Il file di catalogo, che memorizza tutti i record di file e directory in una singola struttura di dati, causa problemi di prestazioni quando il sistema consente il multitasking, poiché solo un programma può scrivere su questa struttura alla volta, il che significa che molti programmi potrebbero essere in attesa in coda a causa di un programma "hogging" del sistema. È anche una seria preoccupazione di affidabilità, poiché i danni a questo file possono distruggere l'intero file system.

Quindi le prestazioni sono naturalmente degradate grazie al fatto che il file di catalogo può essere utilizzato da un solo programma alla volta. E se la directory aumenta di dimensioni, il rischio / degrado causato da quel problema aumenterà solo; più file significa più possibilità per i programmi di accedere ai file in quella directory. Ulteriore conferma di quell'idea qui ; di nuovo l'enfasi è mia:

Il file di catalogo è una struttura complicata. Poiché mantiene tutte le informazioni sui file e sulle directory, forza la serializzazione del file system, una situazione non ideale in presenza di un numero elevato di thread che desiderano eseguire l'I / O dei file. In HFS, qualsiasi operazione che crei un file o modifichi un file in qualsiasi modo deve bloccare il file di catalogo, impedendo ad altri thread di accedere in sola lettura al file di catalogo. L'accesso al file di catalogo deve essere a scrittore singolo / multireader.


Grazie mille. Capisco che l'accesso al file di catalogo sarà il collo di bottiglia e può causare seri problemi di prestazioni soprattutto per il multitasking.
Daisuki Honey,

@DaisukiHoney Prego! Quindi, se hai trovato utile la mia risposta, ricordati di votarla. E se è stata la risposta a risolvere il problema, ricordati di spuntarlo come tale.
Jake:

Sì, sicuramente voterò la tua risposta e la selezionerò. Ancora grazie mille.
Daisuki Honey,

Le sezioni di Wikipedia che citi parlano di limiti di scalabilità per filesystem, non per directory: esiste un solo file di catalogo per filesystem e tutti gli accessi devono serializzare su questo. È abbastanza irrilevante per la domanda.
poolie,

@poolie La domanda riguarda la directory che esiste su un file system. Il file di catalogo esiste per file system ma la stessa directory esiste anche sullo stesso file system. È rilevante per una domanda relativa a oltre 10.000 file in una directory esistente su un singolo file system. Ma questa domanda ha più di 2 anni, quindi grazie per il link Wiki. Ho aggiornato la mia risposta per includere la nuova formulazione e un collegamento diretto alla sezione in questione.
JakeGould,

4

Risposta breve: Beh, se stai leggendo 100.000 file, potrei aspettarmi che lo script sia lento.

Risposta lunga: per rispondere a questa domanda in modo più approfondito, devi guardare il file system su un Mac. I Mac usano HFS + ( Hierarchical File System Plus ), che è un file system moderno che ha dei limiti, ma solo in situazioni estreme.

Dalla mia esperienza, è molto simile a un file system di journaling EXT per Linux. Supporta il montaggio di directory, autorizzazioni simili a UNIX, ecc. Ha indirizzato i file in un formato a 32 bit, rendendo il numero massimo di file che è possibile archiviare in un volume 4.294.967.295, secondo questa fonte.

Il file system inizia a rompersi con file superiori a 8 EB su sistemi moderni e fino a 2,1 miliardi di file e cartelle in una posizione come indicato qui .

Dato il modo in cui HFS + - o in realtà qualsiasi file system è configurato per quella materia - avere molti file in una cartella non dovrebbe fare nulla di "strano".

Onestamente, non penso che ci sarebbe un miglioramento delle prestazioni distribuendo i file attraverso una gerarchia di cartelle più complessa. In realtà, questa tecnica potrebbe essere meno efficiente perché il tuo script dovrebbe effettuare chiamate per cambiare directory a metà processo.


Giusto. Ho pensato di cambiare la gerarchia di directory, ma causa un algoritmo più complicato e sospetto che questo miglioramento delle prestazioni. Grazie per la risposta. Al momento ho 200.000 file nella directory e potrei averne 1.000.000 alla fine. Spero che funzioni bene senza quella brutta performance.
Daisuki Honey,

@DaisukiHoney Se stai lavorando con così tanti file, potrebbe valerne la pena vedere se riesci a suddividere le cose in directory. Potrebbe essere difficile da fare in questa fase, ma potrebbe rendere le cose un po 'più stabili andando avanti.
Jake:

@JakeGould Grazie per il consiglio. Ho pensato alla ristrutturazione perché potrei aggiungere altri file. Grazie.
Daisuki Honey,
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.