Vorremmo archiviare milioni di file di testo in un filesystem Linux, con lo scopo di essere in grado di comprimere e servire una raccolta arbitraria come servizio. Abbiamo provato altre soluzioni, come un database chiave / valore, ma i nostri requisiti di concorrenza e parallelismo rendono l'utilizzo del filesystem nativo la scelta migliore.
Il modo più semplice è archiviare tutti i file in una cartella:
$ ls text_files/
1.txt
2.txt
3.txt
che dovrebbe essere possibile su un file system EXT4 , che non ha limiti al numero di file in una cartella.
I due processi FS saranno:
- Scrivi file di testo dal web scrape (non dovrebbe essere influenzato dal numero di file nella cartella).
- Comprimi i file selezionati, forniti da un elenco di nomi di file.
La mia domanda è: l'archiviazione di un massimo di dieci milioni di file in una cartella influirà sulle prestazioni delle operazioni di cui sopra o sulle prestazioni generali del sistema, diversamente dalla creazione di un albero di sottocartelle in cui i file devono vivere?
ls -l
o qualsiasi altra cosa che stat
sia ogni inode nella directory (es. bash
Globbing / completamento della scheda) sarà artificialmente più veloce che dopo un po 'di usura (cancellare alcuni file, scriverne di nuovi). ext4 potrebbe fare di meglio con XFS, perché XFS alloca dinamicamente lo spazio per gli inode rispetto ai dati, in modo da poter finire con inode più dispersi, credo. (Ma questa è una supposizione pura basata su una conoscenza molto poco dettagliata; ho appena usato ext4). Vai con abc/def/
subdir.
ZipOutputStream
batterebbero praticamente qualsiasi filesystem nativo Linux gratuito - dubito che tu voglia pagare per il GPFS di IBM. Il ciclo per elaborare un set di risultati JDBC e rendere tale flusso zip è probabilmente solo 6-8 righe di codice Java.
dir_index
, che è spesso abilitato per impostazione predefinita, velocizzerà le ricerche ma potrebbe limitare il numero di file per directory.