Bối cảnh
Tôi có một thư mục gồm hàng ngàn tệp zip được ghi ngày tháng trong mẫu YYYYMMDD_hhmmss.zip
và mỗi tệp khoảng 300K. Trong mỗi tệp zip có khoảng 400 tệp xml, mỗi tệp khoảng 3K.
Vấn đề
Tôi cần có thể tìm kiếm và tìm một chuỗi nhất định trong phạm vi ngày của các tệp zip.
Giải pháp hiện tại (mặc dù tầm thường)
Tôi có một lớp lót sau đây
find /home/mydir/ -type f | sort | \
awk "/xml_20140207_000016.zip/,/xml_20140207_235938.zip/" | \
xargs -n 1 -P 10 zipgrep "my search string"
Quan điểm của nó là
- liệt kê tất cả các tập tin trong thư mục nghìn tập tin của tôi
- sắp xếp danh sách các tập tin
- lấy một phạm vi tệp dựa trên ngày đã cho (
awk
lệnh này chỉ in các dòng sau chuỗi khớp đầu tiên đó và tối đa chuỗi khớp thứ hai đó) - chuyển từng dòng kết quả tương ứng với một tệp
zipgrep
Câu hỏi
Lớp lót này chạy chậm khủng khiếp, thậm chí với 10 quy trình trên máy 24 lõi. Tôi tin rằng nó chậm vì zipgrep
lệnh nhưng tôi không đủ khôn ngoan để biết cách cải thiện nó. Tôi không biết mình có nên không, nhưng tôi hơi xấu hổ khi một đồng nghiệp đã viết một công cụ java chạy nhanh hơn kịch bản này. Tôi muốn đảo ngược điều đó nếu có thể. Sau đó, có ai biết làm thế nào để thực hiện lệnh này nhanh hơn trong bối cảnh này? Hoặc để cải thiện bất kỳ phần nào của nó?
unzip -p
hoặc unzip -c
sẽ cải thiện một chút.
unzip -c
tệp zip có liên quan đến kết quả của bạn không và chỉ sau đó kiểm tra kỹ hơn các tệp riêng lẻ trong đó.