2010-02-21 2 views
7

Sviluppo qualche progetto PHP su piattaforma Linux. Ci sono degli svantaggi nel mettere diverse migliaia di immagini (file) in una directory? Questo è un insieme chiuso che non crescerà. L'alternativa sarebbe quella di separare questi file usando la struttura delle directory basata su qualche ID (in questo modo si direbbe solo 100 in una directory).Molti file in una directory?

Ho fatto questa domanda, perché spesso vedo una tale separazione quando guardo URL di immagini su siti diversi. Potete vedere che la separazione delle directory è fatta in questo modo, che non più di diverse centinaia di immagini si trovano in una directory.

Cosa potrei ottenere non mettendo diverse migliaia di file (di un set non crescente) in una directory ma separandoli in gruppi di ad es. 100? Vale la pena complicare le cose?

UPDATE:

  • Non ci sarà alcuna iterazione programmatica su file in una directory (solo un accesso diretto ad un'immagine da esso è il nome del file)
  • voglio sottolineare che il set di immagini è chiuso. Sono meno di 5000 immagini, e questo è quanto.
  • Non c'è categorizzazione logica di queste immagini
  • accesso umana/browse non è richiesto
  • Le immagini hanno nomi di file unici
  • OS: Debian/Linux 2.6.26-2-686, Filesystem: ext3

informazioni utili dal RISPOSTE:

Perché separati molti file in directory diverse:

  • "limite di file di 32k per directory quando si utilizza ext3 su NFS"
  • ragione prestazioni (velocità di accesso) [ma per diverse migliaia di file che è difficile dire se vale la pena, senza misurare]

risposta

2

in genere il motivo di tale suddivisione è le prestazioni del file system. per un set chiuso di 5000 file non sono sicuro che ne valga la pena. Ti suggerisco di provare il semplice approccio di mettere tutti i file in una directory, ma tieni d'occhio il tempo reale necessario per accedere ai file.

se vedi che non è abbastanza veloce per le tue esigenze, puoi dividerlo come hai suggerito.

Ho dovuto suddividere i file personalmente per motivi di prestazioni. inoltre ho urtato un limite di 32k per directory quando uso ext3 su nfs (non sono sicuro se è un limite di nfs o ext3). quindi questo è un altro motivo per dividere in più directory. in ogni caso, provate con una sola dir e dividete solo se vedete che non è abbastanza veloce.

+1

'(non sono sicuro se si tratta di un limite di nfs o ext3)' È un limite ext3. – thomasrutter

0

L'unica ragione per cui potevo immaginare dove sarebbe stato dannoso era quando si scorreva la directory. Più file, significa più iterazioni. Ma questo è fondamentalmente tutto ciò che posso pensare da una prospettiva di programmazione.

1

penso che ci sono due aspetti a questa domanda:

  1. fa il file system di Linux che si sta utilizzando in modo efficiente supportare le directory con migliaia di file. Non sono un esperto, ma penso che i nuovi file system non avranno problemi.

  2. Ci sono problemi di prestazioni con specifiche funzioni PHP? Penso che l'accesso diretto ai file dovrebbe essere ok, ma se stai facendo elenchi di directory allora potresti finire col tempo o problemi di memoria.

7

Oltre a accesso ai file più veloce, separando le immagini in sottodirectory, è anche estendere notevolmente il numero di file che è possibile tenere traccia prima di colpire i limiti naturali del filesystem.

Un approccio semplice è quello di md5() il nome del file, quindi utilizzare i primi n personaggi come il nome della directory (ad esempio, substr(md5($filename), 2)). Ciò garantisce una distribuzione ragionevolmente uniforme (vs prendendo il primo n caratteri del nome file diritto).

+0

Più di un livello sarebbe utile in ulteriori livelli di sottodirectory. Ad esempio: ./12/34/56/78/1234567890abc.jpg. –

+0

Ok, quindi md5 sarebbe un approccio generale. Nel mio caso ho già un ID univoco, perché ogni immagine è associata esattamente a una riga di database (che ha la sua riga principale, ovviamente). Penso che sia uno scenario tipico. – JohnM2

+1

Vale la pena considerare che questi numeri potrebbero non essere equamente distribuiti come sarebbero gli hash MD5. –

0

Diverse migliaia di immagini sono ancora a posto. Quando si accede a una directory, i sistemi operativi leggono l'elenco dei suoi file per blocchi di 4K. Se si dispone di una struttura di directory semplice, potrebbe essere necessario del tempo per leggere l'intero elenco dei file se ci sono molti file (ad esempio centinaia di migliaia).

1

Non v'è alcun motivo per dividere i file in più directory, se non vuoi aspettare eventuali conflitti di nome file e se non c'è bisogno di iterare su quelle immagini in qualsiasi punto.

Ma ancora, se si può pensare ad una categorizzazione suggestiva, non è una cattiva idea per ordinare le immagini un po ', anche se è solo per motivi di manutenzione.

0

Se la modifica del filesystem è un'opzione, mi consiglia di spostarla ovunque si memorizzino tutte le immagini su un file system ReiserFS. È eccellente per l'archiviazione/accesso veloce di molti piccoli file.

In caso contrario, la risposta di MightyE di romperle in cartelle è più logica e aumenterà i tempi di accesso con un margine considerevole.