Posizionamento di molti (10 milioni) file in una cartella


17

Ho appena aggiunto una funzione di ricerca predittiva (vedi esempio sotto) al mio sito che gira su un server Ubuntu. Questo viene eseguito direttamente da un database. Voglio memorizzare il risultato nella cache per ogni ricerca e utilizzarlo se esiste, altrimenti crearlo.

Ci sarebbe qualche problema con me nel salvare il potenziale cira 10 milioni di risultati in file separati in una directory? O è consigliabile dividerli in cartelle?

Esempio:


5
Sarebbe meglio dividere. Qualsiasi comando che tenti di elencare il contenuto di quella directory probabilmente deciderà di spararsi.
Muru,

8
Quindi se hai già un database, perché non usarlo? Sono sicuro che il DBMS sarà in grado di gestire meglio milioni di record rispetto al filesystem. Se sei impegnato a utilizzare il filesystem devi creare uno schema di suddivisione usando una sorta di hash, a questo punto IMHO sembra che usare il DB sarà meno lavoro.
Roadmr,

3
Un'altra opzione per la memorizzazione nella cache che si adatterebbe meglio al modello potrebbe essere memcached o redis. Sono archivi di valori chiave (quindi si comportano come un'unica directory e accedi agli elementi solo per nome). Redis è persistente (non perderà i dati quando viene riavviato) dove memcached è per più elementi temporanei.
Stephen Ostermiller,

2
C'è un problema con pollo e uova qui. Gli sviluppatori di strumenti non gestiscono le directory con un numero elevato di file perché le persone non lo fanno. E le persone non creano directory con un gran numero di file perché gli strumenti non lo supportano bene. per esempio capisco una volta (e credo che ciò sia ancora vero), una richiesta di funzionalità per creare una versione del generatore di os.listdirin Python è stata negata categoricamente per questo motivo.

Dalla mia esperienza ho visto rotture quando si superano i 32k file in una singola directory su Linux 2.6. Naturalmente è possibile sintonizzarsi oltre questo punto, ma non lo consiglierei. Basta dividere in alcuni strati di sottodirectory e sarà molto meglio. Personalmente lo limiterei a circa 10.000 per directory che ti darebbe 2 livelli.
Wolph,

Risposte:


25

Ci sarebbe qualche problema con me a salvare il potenziale circa 10 milioni di risultati in file separati in una directory?

Sì. Probabilmente ci sono più motivi, ma questi posso postare la parte superiore della mia testa:

  • tune2fsha un'opzione chiamata dir_indexche tende ad essere attivata per impostazione predefinita (su Ubuntu lo è) che consente di archiviare circa 100k file in una directory prima di vedere un hit delle prestazioni. Questo non è nemmeno vicino ai file di 10m a cui stai pensando.

  • exti filesystem hanno un numero massimo fisso di inode. Ogni file e directory utilizza 1 inode. Utilizzare df -iper una visualizzazione gratuita delle partizioni e degli inode. Quando si esauriscono gli inode non è possibile creare nuovi file o cartelle.

  • comandi simili rme lsquando si utilizzano caratteri jolly espandere il comando e finirà con un "elenco di argomenti troppo lungo". Dovrai utilizzare findper eliminare o elencare i file. E findtende ad essere lento.

O è consigliabile dividerli in cartelle?

Sì. Sicuramente. Fondamentalmente non è nemmeno possibile memorizzare file da 10m in 1 directory.

Vorrei usare il database. Se si desidera memorizzarlo nella cache per un sito Web, consultare " solr " ("fornire indicizzazione distribuita, replica e query con bilanciamento del carico").


8

Finito con lo stesso problema. Esegui i miei benchmark per scoprire se puoi posizionare tutto nella stessa cartella anziché avere più cartelle. Sembra che puoi ed è più veloce!

Prova delle prestazioni

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


1
Grazie, è molto utile Sto usando questo su un sito ed è stato un vero problema riprogrammare questa parte per avere le strutture di directory /abc/efg.html. Quindi tornerò in una directory flat in futuro.
Kohjah Breese,

0

Una ricerca binaria può gestire facilmente milioni di record, quindi la ricerca nella singola directory non sarebbe un problema. Lo farà molto velocemente.

Fondamentalmente se si utilizza un sistema a 32 bit, la ricerca binaria fino a record da 2Gb è facile e buona.

Berekely DB, un software open source, consentirebbe prontamente di archiviare il risultato completo in una voce e di avere la ricerca integrata.

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.