Linux'ta büyük dosyalar nasıl dağılır


31

diff: memory exhaustedCentOS 5 ve 4 GB RAM'e sahip bir Linux kutusunda büyük ölçüde benzer olan iki adet 27 GB'lik dosyayı dağıtmaya çalışırken hata alıyorum . Bu bilinen bir problem, öyle görünüyor.

Böyle önemli bir fayda için bir alternatif olmasını beklerdim ama bir tane bulamıyorum. Çözümün, ihtiyaç duyduğu bilgileri depolamak için bellek yerine geçici dosyaları kullanması gerektiğini düşünüyorum.

  • Kullanmaya çalıştım rdiffve xdeltabunlar iki dosya arasındaki değişiklikleri göstermek için daha iyi, yamalar gibi, ve iki dosya arasındaki farklılıkları incelemek için pek kullanışlı değiller.
  • VBinDiff'i denedim , ancak ikili dosyaları karşılaştırmak için daha iyi bir görsel araçtır. Farklılıkları düzenli bir şekilde STDOUT'a yönlendirebilecek bir şeye ihtiyacım var diff.
  • vimdiffBunun sadece daha küçük dosyalarla çalışması gibi birçok yardımcı program vardır .
  • Solaris'i de okudum bdiffama Linux için bir bağlantı noktası bulamadım.

Dosyayı daha küçük parçalara bölmenin dışında bir fikriniz var mı? 40 tane dosyam var, bu yüzden onları parçalama işinden kaçının.


xdelta'nın hangi sürümünü denedin? xdelta3 veya xdelta1?
nmuntz

1.1.4 versiyonuydu. Xdelta3 farklı işlevler sağlar mı? Ben sadece çevrimiçi dokümanı kontrol ettim ve hala "delta" sağlamakla ilgili görünüyor.
Tom B


Ayrıca bu cevaba bakınız: unix.stackexchange.com/a/77259/27186
utanmadan

Yanıtlar:


12

cmpşeyler bayt bayt yapar, bu nedenle büyük olasılıkla hafızası tükenmez (yalnızca iki 7 GB dosya üzerinde test edilmiştir) - ancak " X ve Y dosyalarının baytta farklı olduğu" listesinden daha fazla ayrıntı arıyor olabilirsiniz. x , satır y ". Dosyalarınızın benzerliği ofsetse (örneğin, Y dosyası aynı metin bloğunda aynı blokta değil), ofsetleri cmp; Muhtemelen küçük bir komut dosyası ile yeniden senkronizasyon karşılaştırması haline dönüştürebilirsiniz.

Bir kenara: İki dizin yapısının (çok büyük dosyalar içeren) aynı olduğunu onaylamanın bir yolunu ararken başka birinin buraya gelmesi durumunda: diff --recursive --brief(ya da diff -r -qkısa, hatta belki de diff -rq) çalışacak ve hafızası tükenmeyecektir.


güzel, bence -q burada anahtar, bir şekilde bütün dosyayı (veya en azından bütün satırları) belleğe koymak için zorunluluk gerektirmeyebilir ...
rogerdpack

7

Bu linki buldum

diff -H yardımcı olabilir veya dosyaları RAM'e yüklemeye çalışmayan textproc / 2bsd-diff portunu kurmayı deneyebilirsiniz, böylece büyük dosyalar üzerinde daha kolay çalışabilir.

Bu iki seçeneği denediğinizden veya sizin için çalışabileceklerinden emin değilim. İyi şanslar.


1
Bu, oradaki herhangi biri için yardımcı oluyor mu? Benim için, aynı başarısızlık ...
rogerdpack

12
Merak eden herkes için: diff -Hbelgelenmemiş ve kullanımdan kaldırılmış bir takma addır diff --speed-large-files.
a3nm

1
Bu cevap yardımcı olmuyor. Bu bir linux sorusudur ve 2bsd-diff'i yüklemek için önce onu yerleştirmeniz gerekir. Bir kaynak bulduktan sonra . Ve yamalı . Mümkün, ancak muhtemel olmayan uygun bir çözüm.
nyov

1

Dosyalar birkaç baytlık değerler dışında aynı (aynı uzunluk) wise, aşağıdaki gibi bir komut dosyası kullanabilirsiniz ( satır başına hexdump'a kadar bayt sayısıdır, ekran genişliğinize göre ayarlayın):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

Çok hızlı değil ama işi yapıyor.

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.