Cung cấp một thư mục với số lượng lớn tệp nhỏ (> 1 mio) là cách nhanh nhất để nhớ tệp nào đã được xử lý (để nhập cơ sở dữ liệu).Cách xử lý các tệp mới (chưa được xử lý) trong linux
Các giải pháp đầu tiên tôi đã cố gắng là một kịch bản 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
Đối với một mẫu nhỏ hơn (160K file) này chạy ~ 8 phút (không có bất kỳ xử lý)
Tiếp Tôi đã thử một kịch bản 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)
Điều này chạy trong chưa đến 2 phút.
Có cách nào nhanh hơn đáng kể không?
giải pháp khác:
- Di chuyển các file xử lý đến một địa điểm khác nhau là không thuận tiện vì tôi sử dụng s3sync tải tập tin mới
- từ các tập tin có một dấu thời gian như một phần của tên của họ tôi có thể xem xét để dựa vào việc xử lý chúng theo thứ tự và chỉ so sánh tên với ngày "được xử lý lần cuối"
- cách khác, tôi có thể theo dõi lần xử lý cuối cùng chạy và chỉ xử lý các tệp đã được sửa đổi kể từ đó.
thời gian theo dõi có thể là nhanh nhất – redFIVE