बड़ी एक-लाइन फ़ाइल पर बेसिक सेड कमांड: मेमोरी को फिर से आवंटित नहीं कर सकता है


10

मेरे पास 250 एमबी टेक्स्ट फ़ाइल है, सभी एक पंक्ति में।

इस फ़ाइल में मैं aवर्णों के साथ bवर्ण बदलना चाहता हूँ :

sed -e "s/a/b/g" < one-line-250-mb.txt

इसके साथ विफल रहता है:

sed: couldn't re-allocate memory

यह मुझे लगता है कि इस तरह के कार्य को बहुत अधिक मेमोरी आवंटित किए बिना इनलाइन किया जा सकता है।
क्या नौकरी के लिए एक बेहतर उपकरण, या उपयोग करने का एक बेहतर तरीका है sed?


GNU sed संस्करण 4.2.1
Ubuntu 12.04.2 LTS
1 जीबी रैम



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

@RubanSavvy प्लस, अन्य Q में से कोई भी उत्तर लंबी लाइन को ध्यान में नहीं रखता है और वास्तव में, दोनों में संभवतः एक ही मुद्दा होगा।
terdon

क्या आप इस Q में अपना सीड संस्करण और अपनी हार्डवेयर जानकारी (विशेष रूप से RAM) और डिस्ट्रो संस्करण शामिल कर सकते हैं?
slm

जवाबों:


10

हां, trइसके बजाय उपयोग करें :

tr 'a' 'b' < file.txt > output.txt

sedइतनी बड़ी लाइन में सौदे होने से समस्याएं पैदा होंगी। मुझे उम्मीद है कि यह लाइन को पकड़ने के लिए आंतरिक रूप से एक चर घोषित कर रहा है और आपका इनपुट उस चर के लिए आवंटित अधिकतम आकार से अधिक है।

tr दूसरी ओर पात्रों के साथ व्यवहार करता है और मनमाने ढंग से लंबी लाइनों को सही ढंग से संभालने में सक्षम होना चाहिए।


उत्सुकता से मैंने सिर्फ एक 250MB फ़ाइल भरी w / "abcabc ..." बनाया और sed -e "s/a/z/g" b.txt > c.txtबिना किसी समस्या के करने में सक्षम था । Sed (GNU sed) 4.2.2 का उपयोग करना।
slm

@ यहाँ एक 496M फ़ाइल और एक ही sedसंस्करण पर एक ही , लगता है कि यह कार्यान्वयन या हार्डवेयर पर निर्भर करता है।
terdon

हाँ, अगर मुझे एक अनुमान लगाना था कि हम पुराने संस्करण के साथ काम कर रहे हैं sed
slm

5

Sed और awk के ऐतिहासिक संस्करणों में मेमोरी समस्याएं थीं, ये ज्यादातर हाल के संस्करणों में तय की गई हैं, लेकिन इस समस्या की क्लासिक घटनाओं में से एक लैरी वॉल को बहुत कठिन मारा । उनका जवाब एक नई प्रोग्रामिंग भाषा लिखना था - जिसमें हार्डवेयर के अलावा कोई मेमोरी सीमा नहीं थी। उन्होंने इसे पर्ल कहा। आपकी विशिष्ट समस्या को और अधिक सरलता से हल किया जा सकता है, लेकिन अंगूठे का सामान्य नियम है जब सीड पर्ल का उपयोग नहीं करेगा।

संपादित करें: एक उदाहरण के अनुरोध द्वारा:

perl -pe "s/a/b/g" < one-line-250-mb.txt

या कम मेमोरी उपयोग के लिए:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt

1
यह पूरा अनुच्छेद "पर्ल" पर उबलता है। कुछ विवरण अच्छा होगा, या कम से कम एक उदाहरण या कुछ और
माइकल Mrozek

@MichaelMrozek मुझे एहसास है कि हैट कलेक्शन में रौबडाइटिंग होती है, लेकिन मुझे लगा कि आपकी प्रतिष्ठा से आप थोड़ा ध्यान देंगे। विशेष रूप से उस विशिष्ट समस्या को पहले ही हल कर दिया गया था, बहुत संकीर्ण तरीके से, जिससे अधिकांश लोगों को खोज करने में मदद नहीं मिलेगी, इसलिए मैंने सामान्य मामले के लिए एक उत्तर जोड़ा। मेरे द्वारा प्रदान किए गए विस्तृत जवाब से निकोलस राउल को मदद मिली होगी यदि पहले से ही कोई समाधान योग्य समाधान नहीं था, लेकिन मुझे संदेह है कि यह बहुत से अन्य लोगों की मदद करेगा, जबकि मेरा मूल उत्तर हर किसी को मदद करेगा जो sed की सीमा तक पहुंच गया है। अगर आप असहमत हैं तो मैं हटा
दूंगा

@ निस्संदेह मुझे यह पूछने के लिए बहुत ज्यादा नहीं लगता है कि आप मध्यस्थों के अच्छे विश्वास को ग्रहण कर सकते हैं, जब वे आपके उत्तर पर वैध टिप्पणियां कर रहे हैं, बिना उल्टे उद्देश्यों (आरोपों, वास्तव में?) के आरोपों का सहारा लिए बिना।
क्रिस डाउन

@ क्रिसडाउन इसके विपरीत - मैं पूरी तरह से टोपी के लिए इसमें हूं। इसके अलावा इस एक से अधिक लोगों द्वारा नहीं एक जवाब के रूप में चिह्नित किया गया था, लेकिन उस टोपी को एक दूर के द्वितीय प्राथमिकता है
माइकल Mrozek

स्मृति सीमा के साथ दूसरे ने चाल चली (मेरी 2.5 जीबी 1-लाइन फ़ाइल के लिए): धन्यवाद! sedहालांकि, थोड़ा निराश । : \
टॉमिस्लाव नैक-अल्फेयरविक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.