2009-06-11 23 views
6

Web uygulamamda, PHP betiğini kullanarak sayfaları oluşturuyorum ve daha sonra bunlardan statik HTML dosyaları oluşturuyorum. Statik HTML, performansı artırmak için kullanıcılara sunulur. HTML dosyaları sonunda bayatlanır ve silinmesi gerekir.Daha hızlı, 'bulmak -exec' veya 'bulmak | xargs -0 '?

Tahliye komut dosyasını yazmanın iki yolu arasında tartışıyorum.

, ikinci form Xargs aracılığıyla boru gereğidir

find /var/www/cache -type f -mmin +10 -exec rm \{} \; 

gibi, her bulduğu dosya için

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm 

ilk form çağırır rm gibi bir şey tek bulmak komutunu kullanarak ilk, ikinci form sadece tüm dosya adlarını tek bir rm gönderir (ancak dosya listesi çok uzun olabilir).

Hangi form daha hızlı olurdu?

Benim durumumda, önbellek dizini birkaç web sunucusu arasında paylaşılıyor, bu nedenle bu sorun için önemliyse, bu NFS üzerinden gerçekleştirilir.

cevap

6

Her dosya adı için bir işlem oluşturmazken xargs sürümünün biraz daha hızlı olmasını beklerim. Ancak, uygulamada aslında çok fazla fark olması durumunda şaşırırdım. Uzun liste xargs'ları her bir rm çağrısına gönderdiğinden endişe ediyorsanız, kullanacağı jeton sayısını sınırlamak için -l ile xargs kullanabilirsiniz. Ancak, xargs en uzun cmdline uzunluğunu bilir ve bunun ötesine geçmez. Bunu yayınlanmıştır olarak rm kaldırmak istediğiniz her dosya kez yürütülür çünkü

+3

Sanırım argümanlar sayısı kabuktan daha büyükse, xargs otomatik olarak (-l olmadan) birkaç işlem üretecektir. – MatthieuP

+0

Teşekkürler. Xargs'ın bunu yapabileceğini bilmiyordum. – yhager

13

Xargs versiyon -exec sürümden dosyaların bir sürü dramatik hızlıdır, bu Xargs kadar dosya olarak toptan olurken, olduğu Tek bir rm komutuyla birlikte mümkün.

Onlarca veya yüz binlerce dosyada, bir saat veya daha az bir saat arasındaki fark olabilir.

Aynı davranışı "\;" yerine "+" ile bitirerek -exec ile aynı davranışı elde edebilirsiniz. Bu seçenek yalnızca find'un daha yeni sürümlerinde kullanılabilir.

aşağıdaki iki

kabaca eşdeğerdir: işin bazı paralelleştirilebilir çünkü xargs versiyonu hala bir çok işlemcili sistem üzerinde (birkaç yüzde) biraz daha hızlı çalışacağı

find . -print0 | xargs -0 rm 
find . -exec rm \{} + 

Not. Bu, çok fazla hesaplama söz konusu olduğunda özellikle doğrudur.

+1

Xargs'a daha hızlı bir yol buldum. Neredeyse iki saat süren ilk 250.000 dosyadan. Sonra bu SO üzerinde tökezledi ve xargs çalıştı. Bir şampiyon gibi yarım saatte 750.000'i tamamladı! – bbbco

+0

'-exec ...+ '' find' için POSIX standardının bir parçasıdır; bunun için destek oldukça yaygın olmalı. – chepner