दिलचस्प पोस्ट
मैं RequireJS में इकाई परीक्षण के लिए निर्भरता कैसे नकली कर सकता हूं? gitx मैं अपने 'पृथक हेड' को मास्टर में कैसे वापस कर सकता हूं XE16 में ठीक कांच मेनू से मेरी आवाज़ कमांड गायब क्यों है? एएसपी.नेट वेब एपीआई एप्लिकेशन को पोस्ट स्ट्रिंग – रिटर्न रिक्त है पायथन 3 में "1000000000000000 सीमा में (1000000000000001)" इतनी तेज़ी क्यों है? मुझे कैसे पता चलेगा कि क्या कोई पर्ल में एक संख्यात्मक मूल्य है? प्रपत्र प्रमाणीकरण को समझने context.user.identity किसी डॉट नोटेशन स्ट्रिंग का उपयोग करके एक शब्दकोश की जांच करना मैं एक asp.net MVC कार्रवाई में रेफरर यूआरएल कैसे प्राप्त करूं? रेल 3 में बनाम बनाम मैं Google स्प्रेडशीट कैसे खोजूं? जावा में NoClassDefFoundError: com / google / common / base / फ़ंक्शन टंकिनटर: "पायथन को रुपये के लिए कॉन्फ़िगर नहीं किया जा सकता" एक WPF कंटेनर के बच्चों को किस प्रकार से प्राप्त करें? जावाक क्लास के प्रकार तर्कों से संबंधित असंबंधित जेनरिक के बारे में क्यों शिकायत करता है?

पायथन का प्रयोग करके पाठ फ़ाइल को छंटनी

मेरे पास एक पाठ फ़ाइल है जिसमें 10 मिलियन से अधिक लाइनें शामिल हैं इस तरह से लाइनें:

37024469;196672001;255.0000000000 37024469;196665001;396.0000000000 37024469;196664001;396.0000000000 37024469;196399002;85.0000000000 37024469;160507001;264.0000000000 37024469;160506001;264.0000000000 

जैसा कि आपने देखा है, सीमांकक ";" है। मैं दूसरा तत्व के अनुसार अजगर का उपयोग करके इस पाठ फ़ाइल को सॉर्ट करना चाहता हूं। मैं विभाजन समारोह का उपयोग नहीं कर सके क्योंकि यह MemoryError का कारण बनता है मैं इसे कैसे प्रबंधित कर सकता हूं?

Solutions Collecting From Web of "पायथन का प्रयोग करके पाठ फ़ाइल को छंटनी"

मेमोरी में 10 मिलियन लाइनें सॉर्ट नहीं करें इसके बजाय बैचों में इसे विभाजित करें:

  • 100 100 किमी लाइन प्रकार चलाएं (एक इटरेटर के रूप में फ़ाइल का उपयोग करके, islice() के साथ islice() या बैच लेने के समान)। फ़ाइलों को कहीं और अलग-अलग लिखें

  • सॉर्ट किए गए फ़ाइलें मर्ज करें यहां एक मर्ज जनरेटर है कि आप 100 खुली फाइलों को पार कर सकते हैं और यह क्रमबद्ध क्रम में लाइनों को उपज देगा। लाइन द्वारा एक नई फ़ाइल लाइन पर लिखें:

     import operator def mergeiter(*iterables, **kwargs): """Given a set of sorted iterables, yield the next value in merged order Takes an optional `key` callable to compare values by. """ iterables = [iter(it) for it in iterables] iterables = {i: [next(it), i, it] for i, it in enumerate(iterables)} if 'key' not in kwargs: key = operator.itemgetter(0) else: key = lambda item, key=kwargs['key']: key(item[0]) while True: value, i, it = min(iterables.values(), key=key) yield value try: iterables[i][0] = next(it) except StopIteration: del iterables[i] if not iterables: raise 

पायथन के उपयोग से 2 एमबी रैम में एक लाख 32-बिट पूर्णांक छंटनी के आधार पर:

 import sys from functools import partial from heapq import merge from tempfile import TemporaryFile # define sorting criteria def second_column(line, default=float("inf")): try: return int(line.split(";", 2)[1]) # use int() for numeric sort except (IndexError, ValueError): return default # a key for non-integer or non-existent 2nd column # sort lines in small batches, write intermediate results to temporary files sorted_files = [] nbytes = 1 << 20 # load around nbytes bytes at a time for lines in iter(partial(sys.stdin.readlines, nbytes), []): lines.sort(key=second_column) # sort current batch f = TemporaryFile("w+") f.writelines(lines) f.seek(0) # rewind sorted_files.append(f) # merge & write the result sys.stdout.writelines(merge(*sorted_files, key=second_column)) # clean up for f in sorted_files: f.close() # temporary file is deleted when it closes 

heapq.merge() में Python 3.5 के key पैरामीटर हैं । आप mergeiter() पीटर के जवाब से mergeiter() कोशिश कर सकते हैं या mergeiter() को पुराने पायथन संस्करणों पर बदल सकते हैं :

 iters = [((second_column(line), line) for line in file) for file in sorted_files] # note: this makes the sort unstable sorted_lines = (line for _, line in merge(*iters)) sys.stdout.writelines(sorted_lines) 

उपयोग:

 $ python sort-k2-n.py < input.txt > output.txt 

आप इसे एक os.system() कॉल से बैश फ़ंक्शन sort साथ कर सकते हैं

 sort -k2 yourFile.txt