Aggiungi percorsi di file al database

0

Sto analizzando una directory di file e voglio aggiungerli a un database. Ho due varianti:

for file in walk(basedir):
    files.append(file)
for file in files:
    add_to_database(file)

vs

for file in walk(basedir):
    add_to_database(file)

Il primo ha il vantaggio che se sia il database che la directory scansionata risiedono sullo stesso disco fisico, si evita di saltare tra due posizioni sul disco (assumendo spindels) e quindi dovrebbe essere più veloce, al costo del consumo di memoria aggiuntivo.

Quest'ultimo è molto più breve. Sto tendendo verso quest'ultimo, aggiungendo una nota che il database non dovrebbe risiedere sullo stesso disco della directory scansionata.

Qualche idea su questo?

    
posta Isaac 23.03.2015 - 08:33
fonte

2 risposte

3

L'ottimizzazione prematura è la radice di tutto il male. - Donald Knuth

Qualsiasi sistema operativo decente risolverà il problema del salto ostacoli, usando cache di memoria dei blocchi del disco. Risolvere il problema accumulando un elenco non necessario di nomi di file crea un nuovo problema di consumo di memoria: quanto funzionerà la prima versione con 50.000.000 di file? Dimentica la nota, a meno che i test sul rendimento non dimostrino effettivamente un impatto significativo.

    
risposta data 23.03.2015 - 10:38
fonte
0

La preoccupazione principale qui probabilmente non dovrebbe essere il costo del disco, ma la correttezza e l'intento.

Se si intende fare qualcosa di più del semplice inserimento dei file nell'elenco, si consiglia di preferire la soluzione accumula-poi-inserire, poiché ciò fornisce un elenco coerente di file con cui lavorare ulteriormente. Consente inoltre di utilizzare la funzionalità di inserimento collettivo nel database anziché inserire esattamente un file alla volta. Ciò limita anche la durata delle transazioni e dei blocchi, in quanto la fase di inserimento è separata dalla fase di raccolta.

Se invece si interlacciano le chiamate, il database inizia a funzionare prima. Un approccio molto efficiente sarebbe quello di eseguire due attività, una che genera una sequenza di voci per l'altra da consumare mentre va, poiché il lasco nella generazione può essere memorizzato nella sequenza.

Alla fine, cita erroneamente Knuth e fai ciò che funziona. Probabilmente non è un collo di bottiglia.

    
risposta data 23.03.2015 - 13:27
fonte

Leggi altre domande sui tag