SORU
4 NİSAN 2010, Pazar


Veri kaydı başına yaklaşık 1 KB ile Diske 1 TB veri kümesi verildiğinde, nasıl çoğaltır ve 512 MB RAM kullanan ve sınırsız disk alanı bulabilir miyim?

Veri kaydı başına yaklaşık 1 KB ile bir diske 1 TB veri var. Nasıl çoğaltır ve 512 MB RAM kullanan ve sınırsız disk alanı bulabilirim?

CEVAP
5 NİSAN 2010, PAZARTESİ


Sunulan çözümlerin çok çok karmaşık görünüyor. Bir veri yapısı olurken 4**,du jourson birkaç yıl değil, en iyi uygulanan bir durum bu: çünkü hiçbir veri olabilir ile ilgili içeriği sağlaması gerekir sadece korumak Bloom filtre, ama yine de her kayıt (sadece 6-bit!) değer karma ve diske kayıt bloom filtre yararı yok ve preposterously yüksek çarpışma oranına sahip.

Öte yandan, birleştirme sıralama tüm terabayt değil sadece alacak O(n log n) karşılaştırmalar, ama O(n log n) disk trafik, beri çoğunluğun Ara dosyaları cekti var olmak birleştirilmiş disk yerine bellek. Herhangi bir gerçek çözüm bu Bizim birincil darboğaz beri disk trafiği mümkün olduğunca azaltmak için çalışmalısınız.

Veri terabayt etkili bir dosya ne kaydedilir. benim çözüm basit bir varsayım yaparak:

Terabyte dosya kayıtları arasında yineleme ve onları haşhaş. Şifreleme karma gereksiz, pahalı ve çok büyük burada; yerine, 64-bit version of murmurhash gibi bir şey kullanın. 2'den fazla GiB/(büyük olasılıkla, depolama hız verdiği bu günlerde ihtiyacımız var olandan çok daha hızlı) sn karma ve mükemmel (gerçi şifreli olarak güvenli değil) çarpışma direnci vardır. 64-bit bir karma ile, we would expect our first collision at 2^32, yani yaklaşık bir milyar kayıtlarımız herhangi bir çarpışma hiç olmayacak büyük bir ihtimal.

Başka bir dosya için sağlamalarının ve ilgili kayıt kendi farklarını yazın. Beri kayıtları içerir keyfi ikili veri, biz güvenilmiyor Unıx sıralama(1) tür, çünkü bazı sağlamalarının ve uzaklıklar içerebilir ne tür bir(1) yorumlayacaktır olarak karakterlerine. Sadece kayıtları sabit genişlikli (muhtemelen 16 bayt: murmur2 64-bit hash ve 8 bayt için terabyte dosya mahsup için 8 bayt) kayıt olarak yazacağız. Sonuç dosyası hakkında 16 GB, Kayıt numarası verilmelidir.

Güvenli bir şekilde belleğe sığmayacak olan kayıt sayısını okumak ve onları sıralayarak bu dosya, sıralanmış parçalar diske geri yıkama çözebiliriz. Biz uygun daha fazla kayıt içine bellek ile bir yığın sıralaması (kullanır O(1) uzay) daha bir quicksort (hangi kullanır O(log n) bellek için çağrı yığını), ama çoğu uygulamaları, quicksort galibiyetle Erdem bellek konum ve alt talimat sayısı. Bu ara dosyaları (35-40 olmalı) diske yazılır.

Son adım, birleştirme bu dosyalar (bellek; gerek yok saklamak için bir neden disk için) toplayarak tüm karma çarpışmalar ve ararken ilgili kayıtlar terabayt dosya karşılaştırma kayıtlarının çoğaltılması ve yayan kayıtları (uzaklıklar) her ne şekilde olursa olsun sorun belirtir.

Bildiğim kadarıyla söyleyebilirim, bu görev vurur disk daha az veya daha başka bir çözüm önerdi ve çok kavramsal basit: karma kayıtlarına bakmak için çiftleri içinde karma ve doğrulamak gerçek kayıtları.

Disk için I/O, terabayt veri dosyasını oku, 16 GB disk, disk 16 GB okuma ve yeniden sıralanmış yazmak için yazmak, okumak ve çoğaltır dönün. Gibi bir iyileştirme, süreç, karma ve kayıtları olabilir birikir onları hafıza önce onları dışarı kızarma için disk, sıralama, onlardan önce bunu yaparken o keser 16 GB Ara dosya ve izin işlemi için taşı karma doğrudan birleştirme ve raporlama çoğaltır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010