Data una directory con un numero elevato di file di piccole dimensioni (> 1 mio), un modo veloce per ricordare quali file sono già stati elaborati (per l'importazione di un database).Come elaborare solo nuovi file (non elaborati) in linux
La prima soluzione che ho provato era uno script bash:
#find all gz files
for f in $(find $rawdatapath -name '*.gz'); do
filename=`basename $f`
#check whether the filename is already contained in the process list
onlist=`grep $filename $processed_files`
if [[ -z $onlist ]]
then
echo "processing, new: $filename"
#unzip file and import into mongodb
#write filename into processed list
echo $filename #>> $processed_files
fi
done
Per un campione più piccolo (160K file) questo ha funzionato ~ 8 minuti (senza alcun trattamento)
Poi ho provato uno script python:
import os
path = "/home/b2blogin/webapps/mongodb/rawdata/segment_slideproof_testing"
processed_files_file = os.path.join(path,"processed_files.txt")
processed_files = [line.strip() for line in open(processed_files_file)]
with open(processed_files_file, "a") as pff:
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".gz"):
if file not in processed_files:
pff.write("%s\n" % file)
Questo funziona in meno di 2 minuti.
C'è un modo significativamente più veloce che sto trascurando?
Altre soluzioni:
- Moving file elaborati a un diverso posizioni non è conveniente dal momento che usare s3sync per scaricare nuovi file
- dal momento che i file hanno un timestamp come parte del loro nome potrei prendere in considerazione per fare affidamento sull'elaborazione degli stessi in ordine e confrontare solo il nome con una data "ultima elaborazione"
- in alternativa, è possibile tenere traccia dell'ultima volta che è stata eseguita un'elaborazione e elaborare solo i file che sono stati modificati successivamente.
il tempo di tracciamento sarebbe probabilmente il più veloce – redFIVE