लिनक्स पर बड़ी फ़ाइलों को कैसे अलग करें


31

diff: memory exhaustedदो 27 जीबी फाइलों को अलग करने की कोशिश करते समय मुझे एक त्रुटि हो रही है जो कि मुख्य रूप से CentOS 5 और 4 GB RAM वाले लिनक्स बॉक्स पर समान है। यह एक ज्ञात समस्या है, ऐसा लगता है।

मुझे उम्मीद है कि इस तरह की आवश्यक उपयोगिता के लिए एक विकल्प होगा, लेकिन मुझे एक नहीं मिल सकता है। मुझे लगता है कि समाधान के लिए स्मृति के बजाय अस्थायी फ़ाइलों का उपयोग करना होगा ताकि इसकी ज़रूरत की जानकारी संग्रहीत की जा सके।

  • मैंने उपयोग करने की कोशिश की rdiffऔर xdelta, लेकिन वे दो फाइलों के बीच के बदलाव को पैच की तरह दिखाने के लिए बेहतर हैं, और दो फाइलों के बीच के अंतर का निरीक्षण करने के लिए उपयोगी नहीं हैं।
  • VBinDiff की कोशिश की , लेकिन यह एक दृश्य उपकरण है जो बाइनरी फ़ाइलों की तुलना करने के लिए बेहतर है। मुझे ऐसी चीज़ की ज़रूरत है जो नियमित रूप से STDOUT में अंतर को पाइप कर सके diff
  • कई अन्य उपयोगिताओं जैसे vimdiffकि केवल छोटी फ़ाइलों के साथ काम करते हैं।
  • मैंने सोलारिस के बारे में भी पढ़ा है bdiffलेकिन मुझे लिनक्स के लिए पोर्ट नहीं मिला।

फ़ाइल को छोटे टुकड़ों में विभाजित करने के अलावा कोई विचार? मेरे पास इनमें से 40 फाइलें हैं, इसलिए इन्हें तोड़ने के काम से बचने की कोशिश की जा रही है।


xdelta के किस संस्करण का आपने प्रयास किया? xdelta3 या xdelta1?
nmuntz

यह संस्करण 1.1.4 था। क्या xdelta3 अलग कार्यक्षमता प्रदान करता है? मैंने अभी ऑनलाइन डॉक चेक किया है और यह अभी भी "डेल्टास" प्रदान करने के बारे में लगता है।
टॉम बी


इस उत्तर को भी देखें: unix.stackexchange.com/a/77259/27186
unhammer

जवाबों:


12

cmpक्या चीजें बाइट-बाय-बाइट करती हैं, इसलिए यह संभवतः मेमोरी से बाहर नहीं चलेगी (सिर्फ दो 7 जीबी फाइलों पर परीक्षण किया गया है) - लेकिन आप " एक्स और वाई की फाइलों की सूची की तुलना में अधिक विवरण की तलाश में हैं। x , लाइन y ”। यदि आपकी फ़ाइलों की समानताएं ऑफसेट हैं (जैसे, फ़ाइल Y में पाठ का समान ब्लॉक है, लेकिन एक ही स्थान पर नहीं है), तो आप ऑफ़सेट को पास कर सकते हैं cmp; आप शायद इसे एक छोटी स्क्रिप्ट के साथ तुलना करके एक पुन: सिंक्रनाइज़ करने में बदल सकते हैं।

एक तरफ: मामले में किसी और के यहाँ भूमि जब दो निर्देशिका संरचनाओं (बहुत बड़ी फ़ाइलों से युक्त) की पुष्टि करने का एक तरीका खोज रहे हैं: diff --recursive --brief(या diff -r -qसंक्षेप में, या शायद भी diff -rq) काम करेंगे और स्मृति से बाहर नहीं चला जाएगा।


अच्छा, मुझे लगता है कि -q यहाँ की कुंजी है, किसी भी तरह से इसे पूरी फ़ाइल (या कम से कम पूरी लाइनों) को मेमोरी में डालने के लिए अलग-अलग आवश्यकता नहीं हो सकती ...
rogerdpack

7

मुझे यह लिंक मिला

diff -H मदद कर सकता है, या आप textproc / 2bsd-diff पोर्ट को स्थापित करने की कोशिश कर सकते हैं जो स्पष्ट रूप से फ़ाइलों को RAM में लोड करने का प्रयास नहीं करता है, इसलिए यह बड़ी फ़ाइलों पर अधिक आसानी से काम कर सकता है।

मुझे यकीन नहीं है कि अगर आपने उन दो विकल्पों की कोशिश की या यदि वे आपके लिए काम कर सकते हैं। सौभाग्य।


1
यह किसी को भी वहाँ के लिए मदद करता है? मेरे लिए, वही असफलता ...
रॉगरडैक

12
सोच रहे किसी के लिए: के diff -Hलिए एक अनिर्दिष्ट और पदावनत उर्फ ​​है diff --speed-large-files
a3nm

1
यह उत्तर मदद नहीं करता है। यह एक लिनक्स प्रश्न है, और 2bsd-diff स्थापित करने के लिए आपको इसे पहले पोर्ट करना होगा। तुम्हारे जाने के बाद एक स्रोत मिला । और उसे थपथपाया । संभव है, लेकिन एक व्यवहार्य समाधान की संभावना नहीं है।
nyov

1

यदि फ़ाइलें कुछ बाइट मानों को छोड़कर एक जैसी (समान लंबाई) हैं, तो आप निम्न की तरह एक स्क्रिप्ट का उपयोग कर सकते हैं ( wहैक्सडंप पर प्रति पंक्ति बाइट्स की संख्या, अपने प्रदर्शन चौड़ाई में समायोजित करें):

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

यह बहुत तेज़ नहीं है, लेकिन काम करता है।

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