給定一個包含大量小文件(> 1 mio)的目錄,記住哪些文件已被處理(用於數據庫導入)的快速方法是什麼?如何僅在Linux中處理新(未處理)文件
我嘗試的第一個解決方案是一個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
對於較小的樣品(160K文件)此跑〜8分鐘(無任何處理)
接着我試圖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)
這運行不到2分鐘。
有沒有一種明顯更快的方式,我忽略了?
其他的解決方案:
- 移動處理的文件到不同的位置並不方便,因爲我用s3sync下載新的文件
- 因爲文件有一個時間戳,我可能會考慮到他們的名字的一部分依靠對它們進行處理,只將名稱與「最後處理」日期進行比較
- 或者我可以跟蹤上一次處理運行的時間,並且只處理自那之後修改過的文件。
跟蹤時間可能會是最快的 – redFIVE