Devasa dosyalar için 'sort -u' ölçeklenebilirliği


23

'Sort -u' dosyasının makul ölçeklenebilirlik sınırı nedir? ("satır uzunluğu", "satır sayısı", "toplam dosya boyutu"?)

Bunu aşan dosyalar için "satır miktarı" boyutunda Unix alternatifi nedir? (Elbette bir tanesini kolayca uygulayabilirim, ancak birkaç standart Linux komutuyla yapılabilecek bir şey olup olmadığını merak ediyorum?)


: İçinde ikili arama istediğiniz ya da nasıl bilebileceğini olanlar için unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
Yardımdan uniqönce birinin olduğu durumlar var sort -u. BTW, ASCII verileri LC_ALL=C sortiçin GNU’yu sortçok fazla hızlandırıyor ( bu cevaba bakınız )
Walter Tross

Yanıtlar:


39

sortEğer Linux üzerinde bulduğunuz gelen coreutils paketiyle ve uygular bir dış R-Yönlü birleştirme . Verileri, bellekte işleyebileceği parçalara ayırır, diske depolar ve sonra birleştirir. Makine bunun için işlemciler varsa topakları paralel olarak yapılır.

Dolayısıyla, bir sınırlama olsaydı, sortbirleştirmek zorunda olduğu geçici dosyaları, sonuçla birlikte depolamak için kullanılabilecek boş disk alanıdır .


3
GNU sıralamasının bu geçici dosyaları daha da fazla paketlemek için sıkıştırabilir (ve yavaş disklerle performansı artırabilir).
Stéphane Chazelas

1
@ StéphaneChazelas Güncelleme için teşekkürler. Biri tamamen birleştiğinde (kaynak zaten kısmen sıralanmışsa kolayca olabilirdi) bir alan optimizasyonu olarak, yığın dosyalarının bir araya gelmesi durumunda kolayca ayrılabilir hale gelip gelmediğini merak ediyordum. Bugünlerde kaynak koduna
dalacak

3
Hafızanın yanı sıra, birleştirme aşaması için de geçerli bir başka sınır vardır: aynı anda açılabilen dosya sayısı. Bu genellikle işletim sistemi tarafından uygulanan bir sınırdır. GNU sorti, aynı anda eski açabileceği dosya sayısını tekrar tekrar birleştirerek, bununla da başa çıkabilir!
Diomidis Spinellis

@ StéphaneChazelas Çok büyük dosyaları sıralamak için özel bir araç tasarlarsam, satırları orijinal dosyaya indeks olarak kaydederdim. GNU sortisi bunu mu yapıyor yoksa basitçe geleneksel bir sıkıştırma algoritması kullanıyor mu?
Random832

3
@ Random832 ve dosyanın üzerine kendi üzerine yazabilmesi amaçlanmıştır ( sort -o file file)
Stéphane Chazelas

1

Satıcıya özel uygulamalar için konuşamıyorum, ancak UNIX sortuygulama büyük dosyaları daha küçük dosyalara böler, bu dosyaları sıralar ve daha sonra sıralanan daha küçük dosyaları bir toplu sıralı çıktıda birleştirir.

Tek sınırlama, ara tarafından oluşturulan daha küçük dosyalar için disk alanıdır sort, ancak ortam değişkenini ayarlayarak dosyalar isteğe bağlı bir dizine yönlendirilebilir TMPDIR.


3
UNIX sıralama uygulamasını tam olarak ne diyorsunuz ? Unix sürüm 3'teki orijinal mi? Buradaki adam sayfası 128 KB'den büyük dosyaları sıralayamadığını söylüyor.
Stéphane Chazelas

Unix sürüm 3'ten ne anlıyorsunuz? 1973’teki sürüm? Orijinal UNIX sıralama uygulaması yıllar içinde ve IIRC'de geliştirilmiştir, Solaris versiyonu GNU versiyonundan çok daha hızlıdır. Tabii ki, 25 yıl önce çoklu bayt karakterleri anlamak için sıralama geliştirildi ve USENET tartışmasından hatırladığım şey bunun Solaris'te verimli bir şekilde yapılmasıydı. BTW: Büyük dosya farkında olarak man largefilelisteler sort.
schily

2
Peki aslında Oracle satıcısının belirli bir sürümünden sortmi bahsediyorsunuz ? Veya AT&T Unix türünden bir sürümün herhangi bir türevi? Veya Unix sertifikalı herhangi bir sürümü sort( sortOS / X'teki GNU gibi )?
Stéphane Chazelas

sortÇok baytlı karakterlere göre modern uygulamaların kalitesi değişebilir, sortbölünmüş ara dosyaları kullanan gerçeği , orijinal koda dayalı olan tüm UNIX uygulamalarında ortaktır. BTW: Solaris versiyonu "OpenSolaris" olarak
OSS'dir

25 yıl önce, UTF-8 henüz icat edilmedi mi? Solaris 7'de UTF-8 yerel ayar desteği eklendi ( 1 , 2 ). Başka bir çok baytlı karakter kümesine mi bakıyorsunuz?
Stéphane Chazelas

1

Göre https://blog.mafr.de/2010/05/23/sorting-large-files/ ve /unix//a/88704/9689 :

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

Güncelleştirme:

Yukarıdaki cevaplardan sort, pasajın bahsettiğini zaten yaptığımızı görüyoruz - dış R-Way birleşmesi . Yani tüm çalışan sonra sadece:

sort --parallel="$(nproc --all)" -u input > output

Yeterli olmalı.

Sınırlar hakkındaki mevcut varsayımlarım (kodları kontrol etmeden):

  • maksimum hat uzunluğu fiziksel hafıza miktarıyla sınırlıdır. Sıralama ihtiyacı en az iki belleğe sığdırmak
  • satır miktarı - Farkında değilim
  • dosya boyutu - elbette dosya sistemine göre
  • paralel olarak açılan dosyaların miktarı - İşletim Sistemine bağlı olarak ( Bunu işaret ettiğiniz için teşekkürler Diomidis Spinellis !)

(Bu cevap topluluk wiki olarak işaretlenmiştir - geliştirmeye teşvik edilmiş hissedin! :))


2
GNU sortvarsayılan olarak paralel sıralar (bağlandığınız sayfadan bu yana 2010'dan beri), optimum olanı belirlemek --parallelyerine eşzamanlı iş parçacıklarının sayısını azaltmak vardır sort. Sort, zaten daha verimli bir şekilde bölme ve birleştirme işlemini dahili olarak yapar. Ekstra bölmenin işe yarayacağından şüpheliyim.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.