Linux'ta büyük dosyalar için ikili fark / yama?


13

Ben iki bölüm görüntüleri (A ve B) var ve ağ sel olmadan yeni B görüntü almak için başka bir bilgisayarda A uygulayabilirsiniz bir yama oluşturmak için kullanmak istiyorum. Aşağıdaki gereksinimlerim var:

  • Linux üzerinde çalışır
  • fark yaratabilir
  • dosyaları yamalamak için diffs kullanabilir
  • ikili dosyaları işleyebilir
  • büyük dosyaları işleyebilir (birkaç yüz GB çalışmalıdır)
  • kullanıcı etkileşimi gerekmez (yalnızca bir konsol uygulaması)
  • ideal olarak, borulardan okuyabilmeli / yazabilmeliyim (böylece bir gzip sıkıştırılmış dosyadan içine boru oluşturabilir ve birine yazabilirim)

Böyle bir şey var mı?


Ödül başlarken Enter tuşuna çok hızlı bastım. Eklemek istediğim metin:
Basj

Çoğaltılması kolay bir örneği olan bir cevap rdiffgelecekteki referanslar için değerli olacaktır. Örnek: Diyelim file1ve file2her biri 1 GB'lık iki benzer dosya. 1) rdiff nasıl hesaplanır? 2) Bu rdiff bir patchdosyaya nasıl kaydedilir ? 3) Bu patchdosyayı file1kurtarmak için nasıl uygulanır file2?
Basj

Yanıtlar:


13

Muhtemelen rsync ile ilgili araçlara bir göz atmalısınız : rdiff ve rdiff-backup . rdiffKomut bir yama dosyası üretmek ve diğer bazı dosyaya uygulamanızı sağlar.

rdiff-backupKomut dizinin tamamının başa bu yaklaşımı kullanır, ama tek dosya disk görüntüleri ile çalışıyoruz tahmin ediyorum, bu yüzden rdiffkullanımına biri olacak.


1
Rdiff için "imza" ve "delta" ne anlama geliyor? Man sayfası söylemiyor.
Tor Klingberg

1
Kendi sorumu cevaplamak için rdiff ile bir delta oluşturmak iki aşamalı bir süreçtir. Önce eski dosyadan bir imza dosyası oluşturun, ardından delta oluşturmak için imza ve yeni dosyayı kullanın. Birlikte çalışabilirlerrdiff signature oldfile | rdiff delta - newfile deltafile
Tor Klingberg

1
@TorKlingberg Bir örnekle yeni bir cevap gönderebilir misiniz? Diyelim file1ve file2her biri 1 GB'lık iki benzer dosya. 1) Fark nasıl hesaplanır? 2) Bu fark bir yama dosyasına nasıl kaydedilir? 3) file1kurtarmak için bu yama dosyası nasıl uygulanır file2?
Basj

7

xdelta istediğiniz her şeyi yapabilir. Gerçi uyarı, resimleriniz çok benzer değilse , çok büyük bir yama ile sonuçlanabilir, çünkü xdelta farklılıkları bulmak için tanımlanmış bellek arabelleğinin yarısını kullanır. Daha fazla bilgi TuningMemoryBudget wiki sayfasında bulunabilir. Tampon boyutunun arttırılması biraz yardımcı olabilir.

bsdiff başka bir seçenektir, ancak bir RAM görüntüsünün boyutu için çok RAM aç ve tamamen uygunsuz.

bsdiff oldukça bellek açtır. Eski dosyanın boyutu ve yeni dosyanın boyutu olan max(17*n,9*n+m)+O(1)bayt bellek gerektirir . bspatch bayt gerektirir .nmn+m+O(1)


3

Kurallı Yanıt

Mesaj rdiff ile ilgili olarak , librsync 2.0.1 komut işlevselliği açıklama için iyi bir okuma, bu yüzden başka bir şey yoksa içeriği bu cevaba korumak için aşağıda başvurdum.

Bir dosyayı güncellemek için rdiff'in üç adımını iyi bir şekilde anlamaya çalışmak önemlidir : rdiff man sayfasında bahsedildiği gibi imza , delta ve yama . Ayrıca rdiffGitHub'da hangi referans ve alıntı yapacağım yararlı bir komut örneği komut dosyası buldum .

Esasen ...

  1. "Başlangıç" veya temel dosya [ file1] ile ve ondan bir imza dosyası oluşturursunuz
    • Bu genellikle temel / orijinal dosyanın kendisinden çok daha küçüktür
  2. İle imza dosyası başka bir dosyadan [karşı karşılaştırmak file2(sizin baz dosyasına benzer ama farklı] son güncellenen örneğin ) ve bir oluşturmak delta dosyasını iki dosya arasındaki farkları içeren
  3. "Yalnızca farklılıklar" veya delta dosyasını kullanın ve ikisiyle eşleşen file1diğer dosyadaki [ file2] değişiklikleri içeren yeni bir dosya oluşturmak için temel dosyanızla [ ] karşılaştırın .

Hızlı Komutlar (per rdiff-example.sh)

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

Giriş

rdiff, ağ deltalarını hesaplamak ve uygulamak için bir programdır. Rdiff deltası, bir ikili (veya eski) dosyanın bir sonuç (veya yeni) dosya oluşturmak için otomatik olarak nasıl düzenlenebileceğini açıklayan ikili dosyalar arasındaki bir deltadır.

Çoğu diff programından farklı olarak, librsync, diff hesaplandığında her iki dosyaya da erişim gerektirmez. Bir deltanın hesaplanması, eski dosyanın kısa bir "imzasını" ve yeni dosyanın tüm içeriğini gerektirir. İmza, eski dosyanın blokları için sağlama toplamları içerir. Bu sağlama toplamlarını kullanarak, rdiff yeni dosyada eşleşen blokları bulur ve deltayı hesaplar.

rdiff deltaları genellikle xdeltas veya normal metin farklarından daha az kompakt ve daha yavaş üretilir. Delta hesaplanırken hem eski hem de yeni dosyaların bulunması mümkünse, xdelta genellikle çok daha küçük bir dosya üretir. Karşılaştırılan dosyalar düz metinse, farklar insanlar tarafından görülebildiğinden ve hatalı eşleşmeler olarak uygulandığından GNU farkı genellikle daha iyi bir seçimdir.

rdiff, her iki dosyayı aynı anda sunmak uygun olmadığında kendi başına gelir. Bunun bir örneği, iki dosyanın ayrı makinelerde olması ve yalnızca farkları aktarmak istediğinizdir. Başka bir örnek, dosyalardan birinin medyaya arşiv veya yedekleme ortamına taşınması ve yalnızca imzasının bırakılmasıdır.

Sembolik

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

Kalıpları kullan

Rsync algoritmasının tipik bir uygulaması, bir A2 dosyasını bir makine A'dan benzer bir dosya A1'e sahip bir makine B'ye aktarmaktır. Bu şöyle yapılabilir:

  1. B, A1'in rdiff imzasını oluşturur. Buna S1 deyin. B imzayı A'ya gönderir. (İmza genellikle açıkladığı dosyadan çok daha küçüktür.)
  2. A, S1 ve A2 arasındaki rdiff deltasını hesaplar. Bu delta D deyin. A deltayı B'ye gönderir.
  3. B, A2'yi yeniden oluşturmak için deltayı uygular. A1 ve A2'nin aynı bayt çalışmalarını içerdiği durumlarda, rdiff önemli ölçüde yer tasarrufu sağlamalıdır.

kaynak


1
Çok teşekkür ederim!
Basj

1

JDIFF iki (ikili) dosya arasındaki farkların çıktısını veren bir programdır.

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.