2014-05-12 27 views
5

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ừ đó.
+1

thời gian theo dõi có thể là nhanh nhất – redFIVE

Trả lời

5

Chỉ cần sử dụng một bộ:

import os 

path = "/home/b2blogin/webapps/mongodb/rawdata/segment_slideproof_testing" 
processed_files_file = os.path.join(path,"processed_files.txt") 
processed_files = set(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) 
+1

rất thích nhìn thấy một con số về cách điều này tăng tốc độ – Nicolas78

+0

Tuyệt vời - điều này đưa nó xuống từ 120s đến 0.5s – Cilvic

2

cách tiếp cận thay thế bằng tiêu chuẩn tiện ích dòng lệnh:

Chỉ diff một tập tin có chứa một danh sách các tất cả file với một tập tin có chứa một danh sách các xử lý các tập tin.

Dễ dàng thử và phải khá nhanh.

Nếu bạn bao gồm dấu thời gian đầy đủ trong danh sách, bạn cũng có thể nhận tệp 'đã thay đổi' theo cách này.

1

Nếu các tập tin không được sửa đổi sau khi được xử lý, một trong những lựa chọn là để nhớ mới nhất của tệp được xử lý và sau đó sử dụng find 's -newer tùy chọn để lấy các tập tin không-chưa-xử lý.

find $rawdatapath -name '*.gz' -newer $(<latest_file) -exec process.sh {} \; 

nơi process.sh trông giống như

#!/bin/env bash 
echo "processing, new: $1" 
#unzip file and import into mongodb 
echo $1 > latest_file 

Đây là chưa được kiểm tra. Lookout cho các tác dụng phụ không mong muốn trước khi xem xét thực hiện chiến lược này.

Nếu giải pháp hacky/quick'n'dirty được chấp nhận, một giải pháp thay thế là mã hóa trạng thái (được xử lý hoặc không được xử lý) trong quyền đối với tệp, ví dụ như trong nhóm đọc bit quyền.Giả sử umask của bạn là 022, để bất kỳ tệp mới được tạo nào có quyền 644, hãy thay đổi quyền thành 600 sau khi xử lý tệp và sử dụng tùy chọn '-perm để truy xuất các tệp chưa được xử lý.

find $rawdatapath -name '*.gz' -perm 644 -exec process.sh {} \; 

nơi process.sh trông giống như

#!/bin/env bash 
echo "processing, new: $1" 
#unzip file and import into mongodb 
chmod 600 $1 

Một lần nữa đây là chưa được kiểm tra. Lookout cho các tác dụng phụ không mong muốn trước khi xem xét thực hiện chiến lược này.

+0

Tôi thích sự sáng tạo của điều đó, cảm ơn những ý tưởng! – Cilvic

Các vấn đề liên quan