Bunun için iki kolay çözüm var. Temel olarak, xargs
veya kullanarak parallel
.
xargs Yaklaşımı:
Sen kullanabilirsiniz xargs
ile find
aşağıdaki gibi:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
number_of_processes
Başlatılmasını istediğiniz maksimum işlem sayısıyla değiştireceğiniz yer . Ancak, performansınızın G / Ç'nin sınırlı olması durumunda size önemli bir performans göstermesi garanti edilmez. Bu durumda, G / Ç için bekleyen kaybedilen zamanı telafi etmek için daha fazla işlem başlatmayı deneyebilirsiniz.
Ayrıca, bulmanın dahil edilmesiyle, değişiklik zamanı gibi sadece dosya kalıpları yerine daha gelişmiş seçenekler belirleyebilirsiniz.
Stéphane'nin yorumlarında açıklandığı gibi, bu yaklaşımla ilgili olası bir sorun, eğer az dosya varsa, xargs
onlar için yeterince fazla işlem başlamayabilir. Çözümlerden biri , bir seferde borudan kaç tane argüman alacağını belirtmek için -n
seçeneği kullanmak olacaktır xargs
. Ayar -n1
, xargs
her bir dosya için yeni bir işlem başlatmaya zorlar . Dosyalar çok büyükse (bu sorunun durumunda olduğu gibi) ve göreceli olarak daha az sayıda dosya varsa, bu istenen bir davranış olabilir. Ancak, eğer dosyalar kendileri küçükse, yeni bir işlem başlatmanın yükü, paralellik avantajını zayıflatabilir, bu durumda daha büyük bir -n
değer daha iyi olacaktır. Bu nedenle, -n
seçenek dosya boyutlarına ve sayısına göre ince ayar yapılabilir.
Paralel Yaklaşım:
Bunu yapmanın başka bir yolu, Ole Tange GNU Parallel aracını kullanmaktır parallel
( burada bulunabilir ). Bu, paralellik üzerinde daha iyi tanecik kontrolü sağlar ve hatta birden fazla ana bilgisayara dağıtılabilir (örneğin, dizininiz paylaşılıyorsa faydalı olabilir). Paralel kullanan en basit sözdizimi:
find . -type f | parallel -j+1 grep mypattern
Seçeneğin -j+1
makinenizdeki çekirdek sayısını aşan bir işlemi başlatmak için paralel talimat verdiği durumlarda (Bu, G / Ç sınırlı işler için faydalı olabilir, hatta sayıca daha yükseğe çıkmayı deneyebilirsiniz).
Paralel ayrıca, xargs
her işlemden çıktının sırasını koruma ve bitişik bir çıktı üretme avantajına sahiptir . Örneğin, xargs
1. işlem bir satır üretiyorsa p1L1
, 2. işlem bir satır oluşturur p2L1
, 1. işlem başka bir satır oluşturur p1L2
, çıktı şöyle olacaktır:
p1L1
p2L1
p1L2
Oysa parallel
çıktı ile:
p1L1
p1L2
p2L1
Bu genellikle xargs
çıktıdan daha kullanışlıdır .