लिनक्स पर बड़ी फ़ाइलों के लिए द्विआधारी अंतर / पैच?


13

मुझे दो विभाजन छवियां (ए और बी) मिली हैं और उन्हें एक पैच बनाने के लिए उपयोग करना चाहते हैं जो कि मैं एक अन्य कंप्यूटर पर ए पर लागू कर सकता हूं ताकि नई बी छवि प्राप्त करने के लिए नेटवर्क को बाढ़ किए बिना। मेरी निम्नलिखित ज़रूरतें हैं:

  • लिनक्स पर काम करता है
  • भिन्न बना सकते हैं
  • फ़ाइलों को पैच करने के लिए भिन्न का उपयोग कर सकते हैं
  • बाइनरी फ़ाइलों को संभाल सकते हैं
  • बड़ी फ़ाइलों को संभाल सकता है (कुछ सौ जीबी काम करना चाहिए)
  • कोई उपयोगकर्ता बातचीत की आवश्यकता (सिर्फ एक सांत्वना आवेदन)
  • आदर्श रूप से, पाइपों से पढ़ने / लिखने में सक्षम होना चाहिए (ताकि मैं इसे gzip-संकुचित फ़ाइल से पाइप कर सकूं और लिखने के लिए कह सकूं)

क्या ऐसा कुछ मौजूद है?


मैं बाउंटी शुरू करते समय एंटर कुंजी को बहुत तेजी से हिट करता हूं। यहाँ वह पाठ है जो मैं जोड़ना चाहता था:
२०:०५

rdiffभविष्य के संदर्भ के लिए एक आसान-से-पुन: प्रस्तुत उदाहरण के साथ एक उत्तर मूल्यवान होगा। उदाहरण: लेट्स कहते हैं file1और file2कर रहे हैं दो 1GB प्रत्येक के समान फ़ाइलें। 1) rdiff की गणना कैसे करें? 2) इस rdiff को patchफाइल में कैसे सेव करें ? 3) कैसे पुनर्प्राप्त patchकरने के file1लिए इस फ़ाइल को लागू करने के लिए file2?
बसज 20

जवाबों:


13

आपको शायद rsync- संबंधित टूल: rdiff और rdiff-backup पर एक नज़र डालनी चाहिएrdiffआदेश आप एक पैच फ़ाइल का उत्पादन और कुछ अन्य फाइल करने के लिए इसे लागू करने देता है।

यह rdiff-backupकमांड संपूर्ण निर्देशिकाओं से निपटने के लिए इस दृष्टिकोण का उपयोग करता है, लेकिन मैं अनुमान लगा रहा हूं कि आप सिंगल-फाइल डिस्क छवियों के साथ काम कर रहे हैं, इसलिए rdiffउपयोग करने वाला एक ही होगा।


1
Rdiff के लिए "हस्ताक्षर" और "डेल्टा" का क्या अर्थ है? मैन पेज नहीं कहता।
तोर क्लिंगबर्ग

1
मेरे अपने प्रश्न का उत्तर देने के लिए, rdiff के साथ एक डेल्टा बनाना एक दो चरण की प्रक्रिया है। पहले पुरानी फ़ाइल से एक हस्ताक्षर फ़ाइल बनाएँ, फिर डेल्टा बनाने के लिए हस्ताक्षर और नई फ़ाइल का उपयोग करें। इन्हें साथ में चलाया जा सकता हैrdiff signature oldfile | rdiff delta - newfile deltafile
Tor Klingberg

1
@TorKlingberg क्या आप एक उदाहरण के साथ एक नया उत्तर दे सकते हैं? मान लें कि file1और file2प्रत्येक 1GB की दो समान फाइलें हैं। 1) अंतर की गणना कैसे करें? 2) इसे बचाने के लिए पैच फाइल में कैसे बदलें? 3) कैसे file1पुनर्प्राप्त करने के लिए इस पैच फ़ाइल को लागू करने के लिए file2?
बसज

7

xdelta वह सब कुछ कर सकता है जो आप चाहते हैं। निष्पक्ष चेतावनी हालांकि, यदि आपकी छवियां बहुत समान नहीं हैं , तो आप बहुत बड़े पैच के साथ समाप्त हो सकते हैं, क्योंकि xdelta अंतर खोजने के लिए परिभाषित मेमोरी बफर के आधे हिस्से का उपयोग करता है। अधिक जानकारी TuningMemoryBudget विकी पेज पर उपलब्ध है । बफ़र का आकार बढ़ाने से कुछ हद तक मदद मिल सकती है।

bsdiff एक और विकल्प है, लेकिन यह बहुत रैम है भूख और डिस्क छवि के आकार के लिए पूरी तरह से अनुपयुक्त है।

bsdiff काफी स्मृति-भूख है। इसके लिए max(17*n,9*n+m)+O(1)मेमोरी बाइट्स की आवश्यकता होती है, जहां nपुरानी फ़ाइल mका आकार है और नई फ़ाइल का आकार है। bspatchn+m+O(1) बाइट्स की आवश्यकता है ।


3

विहित उत्तर

के बारे में rdiff पोस्ट, 2.0.1 librsync एक अच्छा आदेश कार्यक्षमता स्पष्टीकरण के लिए पढ़ा तो मैं संदर्भित किया है कि इस सवाल का जवाब और कुछ नहीं करता है, तो करने के लिए सामग्री को बचाने के लिये नीचे।

यह आवश्यक है कि किसी फाइल को अपडेट करने के लिए rdiff के तीन चरणों की अच्छी समझ प्राप्त करें: rdiff मैन पेज पर बात की गई हस्ताक्षर , डेल्टा और पैच । मुझे rdiffGitHub पर एक कमांड उदाहरण स्क्रिप्ट भी मिली है जो सहायक है जिसे मैं संदर्भ और उद्धरण दूंगा।

अनिवार्य रूप से ...

  1. के साथ एक "शुरू करने" या आधार फ़ाइल [ file1] और आप एक बनाने के हस्ताक्षर फ़ाइल से
    • यह आमतौर पर आधार / मूल फ़ाइल की तुलना में बहुत छोटा होता है
  2. साथ हस्ताक्षर फ़ाइल आप इसे किसी अन्य फ़ाइल [खिलाफ तुलना file2] अपने आधार फाइल करने के लिए समान है, लेकिन अलग ( जैसे हाल ही में अद्यतन ) और एक बनाने के डेल्टा फ़ाइल दो फ़ाइलों के बीच सिर्फ मतभेद युक्त
  3. "अंतर केवल" या डेल्टा फ़ाइल का उपयोग करें और दोनों के साथ मेल खाने वाली file1अन्य फ़ाइल [ file2] से बदलाव वाली एक नई फ़ाइल उत्पन्न करने के लिए अपनी आधार फ़ाइल [ ] से तुलना करें ।

त्वरित कमांड (प्रति 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

परिचय

rdiff नेटवर्क डेल्टास की गणना और लागू करने का एक कार्यक्रम है। एक rdiff डेल्टा बाइनरी फ़ाइलों के बीच एक डेल्टा है, यह वर्णन करता है कि परिणाम (या नई) फ़ाइल बनाने के लिए आधार (या पुरानी) फ़ाइल को स्वचालित रूप से कैसे संपादित किया जा सकता है।

सबसे अलग कार्यक्रमों के विपरीत, लाइब्रिक्स को जब गणना की जाती है, तो दोनों फाइलों तक पहुंच की आवश्यकता नहीं होती है। एक डेल्टा की गणना करने के लिए पुरानी फ़ाइल का केवल एक छोटा "हस्ताक्षर" और नई फ़ाइल की पूरी सामग्री की आवश्यकता होती है। हस्ताक्षर में पुरानी फ़ाइल के ब्लॉक के लिए चेकसम हैं। इन चेकसमों का उपयोग करके, rdiff नई फ़ाइल में मिलान ब्लॉक पाता है, और फिर डेल्टा की गणना करता है।

rdiff deltas आमतौर पर कम कॉम्पैक्ट होते हैं और xelteltas या रेगुलर टेक्स्ट डिफरेंशियल की तुलना में धीमी भी होते हैं। यदि डेल्टा की गणना करते समय पुरानी और नई दोनों फाइलों का मौजूद होना संभव है, तो xdelta आम तौर पर बहुत छोटी फ़ाइल का उत्पादन करेगा। यदि तुलना की जा रही फाइलें सादे पाठ हैं, तो जीएनयू अंतर आमतौर पर एक बेहतर विकल्प होता है, क्योंकि अंतर को मनुष्यों द्वारा देखा जा सकता है और अक्षम मिलान के रूप में लागू किया जा सकता है।

rdiff अपने आप में आ जाता है जब एक ही समय में दोनों फ़ाइलों को पेश करना सुविधाजनक नहीं होता है। इसका एक उदाहरण यह है कि दो फाइलें अलग-अलग मशीनों पर हैं, और आप केवल अंतरों को स्थानांतरित करना चाहते हैं। एक और उदाहरण है जब फ़ाइलों में से एक को केवल अपने हस्ताक्षर को छोड़कर, संग्रह या बैकअप मीडिया में ले जाया गया है।

प्रतीकात्मक

signature(basis-file) -> sig-file

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

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

पैटर्न का उपयोग करें

Rsync एल्गोरिथ्म का एक विशिष्ट अनुप्रयोग एक मशीन A से एक मशीन B से फाइल A2 को स्थानांतरित करना है जिसमें एक समान फ़ाइल A1 है। इसे इस प्रकार किया जा सकता है:

  1. B, A1 का rdiff हस्ताक्षर बनाता है। इस S1 पर कॉल करें। B, A. को हस्ताक्षर भेजता है (हस्ताक्षर आमतौर पर वर्णित फ़ाइल की तुलना में बहुत छोटा है।)
  2. एक S1 और A2 के बीच rdiff डेल्टा की गणना करता है। इस डेल्टा को बुलाओ डी। बी को डेल्टा भेजता है।
  3. B, A2 को दोबारा बनाने के लिए डेल्टा लागू करता है। ऐसे मामलों में जहां A1 और A2 में समान बाइट्स के रन होते हैं, rdiff को एक महत्वपूर्ण स्थान की बचत करनी चाहिए।

स्रोत


1
आपका बहुत बहुत धन्यवाद!
बसज

1

JDIFF एक प्रोग्राम है जो दो (बाइनरी) फ़ाइलों के बीच अंतर को आउटपुट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.