Domanda

Sto cercando di iniziare a utilizzare file di testo semplice per archiviare dati su un server, piuttosto che archiviarli tutti in un grande database MySQL. Il problema è che probabilmente genererei migliaia di cartelle e centinaia di migliaia di file (se mai dovessi ridimensionare). Quali sono i problemi nel fare questo? Diventa davvero lento? Riguarda le stesse prestazioni dell'utilizzo di un database?

Cosa intendo: Invece di avere un database che memorizza una tabella di blog, ha quindi una riga che contiene " autore " ;, " messaggio " e "data" Avrei invece: Una cartella per il post specifico, quindi i file * .txt all'interno di quella cartella che ha il messaggio "autore", "messaggio". e "data" memorizzato in essi.

È stato utile?

Soluzione

Questa lettura sarebbe immensamente più lenta di un database (le scritture dei file avvengono tutte alla stessa velocità - non è possibile memorizzare una scrittura in memoria).

I database sono ottimizzati e pensati per gestire grandi quantità di dati strutturati . I file system non lo sono. Sarebbe un errore provare a replicare un database con un file system. Dopotutto, puoi indicizzare le colonne del tuo database, ma è difficile indicizzare il file system senza un altro strumento.

I database sono creati per un rapido accesso e recupero dei dati. I file system sono creati per l'archiviazione dei dati. Usa lo strumento giusto per il lavoro. In questo caso, è assolutamente un database.

Detto questo, se vuoi creare file HTML per i post e quindi archiviare quelle localizzazioni in un DB in modo da poterle facilmente raggiungere, allora questa è sicuramente una buona soluzione (alla Movable Type).

Ma se memorizzi queste cose su un file system, come puoi scoprire il tuo ultimo post? L'autore più prolifico? L'autore più controverso? Tutte queste cose sono banali con un database e molto difficili con un file system. Attenersi al database, sarai contento di averlo fatto.

Altri suggerimenti

Dipende davvero:

  • Qual è la dimensione del file
  • Quali requisiti di durabilità hai?
  • Quanti aggiornamenti esegui?
  • Che cos'è il file system?

Non è ovvio che MySQL sarebbe più veloce:

Una volta ho fatto tale confronto per oggetto piccolo per usarlo come archivio sessioni per CppCMS . Con un indice (solo chiave) e due indici (chiave primaria e timeout secondario).

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

Come puoi vedere, con il semplice file system Ext3 è stato più veloce o più veloce di Sqlite3 per archiviare i dati perché non ti dà (D) di ACID.

D'altra parte ... DB ti offre molte, molte funzioni importanti che probabilmente ti occorrono, quindi Non consiglierei di usare i file come memoria se non ne hai davvero bisogno.

Ricorda, DB è non sempre il collo di bottiglia del sistema

Dimentica le risposte lunghe, ecco i motivi più semplici per cui archiviare i dati in file di testo in chiaro è una cattiva idea:

  1. È quasi impossibile interrogare. Come classificheresti i post sul blog per data? Dovresti leggere tutti i file e confrontare la loro data o mantenere il tuo file indice (in pratica, scrivi il tuo sistema di database.)

  2. È un incubo il backup. tar cjf non lo taglierà e, se ci provi, potresti finire con uno snapshot incoerente.

Probabilmente ci sono una dozzina di altri buoni motivi per non usare i file, è difficile monitorare le prestazioni, molto difficili da eseguire il debug, quasi impossibile da recuperare in caso di errore, non ci sono strumenti per gestirli, ecc ...

Penso che la chiave qui sia che NON ci sarà indicizzazione sui tuoi dati. Quindi, per recuperare qualsiasi cosa in una ricerca sarebbe ridicolmente lento rispetto a un database indicizzato. Inoltre, le operazioni di I / O sono costose, un database potrebbe essere (parzialmente) in memoria, il che rende i dati disponibili molto più veloci.

Non dici davvero perché non utilizzerai un database da solo ... Ma nello scenario che stai descrivendo, userei sicuramente un DB su una cartella ogni giorno, per un paio di ragioni. Prima di tutto, lo scenario del blog sembra molto semplice ma è molto facile immaginare che un giorno tu vorresti espanderlo con più funzionalità come la ricerca, più dettagli sui post, categorie ecc.

Penso che crescere il modello sarebbe più difficile da fare in una struttura di cartelle che in un DB.

Inoltre, i database sono generalmente MOLTO più veloci dell'accesso ai file a causa dell'indicizzazione e della memorizzazione nella memoria della cache.

IIRC Fudforum ha utilizzato l'archiviazione dei file per motivi di velocità, può essere molto più veloce acquisire un file che cercare un indice DB, recuperare i dati dal DB e inviarlo all'utente. Stai scambiando l'interfaccia del filesystem con le interfacce DB e DB-library.

Tuttavia, ciò non significa che sarà più veloce o più lento. Penso che troverai che la scrittura è più veloce sul filesystem, ma la lettura più veloce sul DB per problemi generali. Se, come fudforum, disponi di dati relativamente immutabili che desideri mostrare più post in uno, un approccio basato su file potrebbe essere molto più veloce: ad esempio, non devono cercare tutti i post correlati, inseriscono tutti 1 file di testo e visualizzalo una volta. Se puoi utilizzare quel tipo di ottimizzazione, il tuo approccio basato su file funzionerà.

Inoltre, i server di posta funzionano anche con un approccio basato su file, il formato Maildir memorizza ogni messaggio e-mail come file in una directory, non in un database.

Una cosa che direi, comunque, sarà meglio archiviare tutto in 1 file, non 3. Il filesystem è migliore nella lettura (e memorizzazione nella cache) di un singolo file rispetto a quello con più file. Quindi, se si desidera memorizzare ogni messaggio in 3 parti, salvarle tutte in un unico file, leggerlo per ottenere una delle parti e visualizzare solo quella che si desidera mostrare.

... e poi vuoi cercare tutti i post di un autore e puoi leggere un milione di file invece di una semplice query SQL ...

I database NON sono più veloci. Pensaci: alla fine memorizzano anche i dati nel filesystem. Quindi la domanda se un database è più veloce dipende fortemente dal percorso di accesso.

Se si dispone di un solo percorso di accesso, correlato alla struttura dei file, il file system potrebbe essere molto più veloce di un database. Assicurati solo di avere un po 'di cache disponibile per il filesystem.

Naturalmente perdi tutte le cose belle di un database: - transazioni - modi flessibili per indicizzare i dati e quindi accedere ai dati in modo flessibile ragionevolmente veloce. - linguaggio di query flessibile (anche se brutto) - elevata recuperabilità.

Il ridimensionamento dipende davvero dal filesystem utilizzato. La maggior parte dei file system di AFAIK ha una sorta di limite superiore per il numero di file (totalmente o per directory), sebbene su quelli nuovi questo sia spesso molto alto. Per centinaia e migliaia di file con una struttura di directory per mantenere le directory a dimensioni ragionevoli, dovrebbe essere possibile trovare un file system ben funzionante.

Il commento di Eric: Dipende da cosa ti serve. Se hai solo bisogno del contenuto esatto sul file per query e puoi determinare la posizione e il nome del file in modo deterministico, l'accesso diretto è più veloce di quello che fa un database, che è approssimativamente:

  • accedi a una serie di voci di indice, al fine di
  • accedi a un gruppo di righe di tabella (rdbms in genere legge blocchi che contengono più righe), al fine di
  • scegli una sola riga dal blocco.

Se lo guardi: hai indici e righe aggiuntive in memoria, che rendono inefficace la memorizzazione nella cache, da dove dovrebbe provenire la velocità di un db?

I database sono ottimi per il caso generale. Ma se hai un caso speciale, c'è quasi sempre una soluzione speciale che è meglio in un certo senso.

se si preferisce andare via con RDBMS, perché non provare l'altro valore di chiave open source o documentare i DB (Dbs non relazionali) ..

Dalla tua pubblicazione capisco che non seguirai alcuna proprietà ACID di db relazionale .. sarebbe meglio adattare altri valori chiave dbs (mongodb, coutchdb o hyphertable) invece della tua implementazione del file system .. fornire prestazioni migliori rispetto agli approcci esistenti ..

Nota: non sono anche esperto in questo .. ho appena iniziato a lavorare su MongoDB e lo trovo utile in scenari simili. volevo solo condividere nel caso non fossi a conoscenza di questi approcci

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top