मैं कोड का यह स्निपेट मिल गया हैप्रसंस्करण केवल गैर रिक्त लाइनों
def send(self, queue, fd):
for line in fd:
data = line.strip()
if data:
queue.write(json.loads(data))
निश्चित रूप से कौन सा बस ठीक काम करता है, लेकिन मैं कभी कभी आश्चर्य है कि अगर वहाँ एक "बेहतर" तरीका है कि निर्माण में लिखने के लिए जहां केवल गैर-खाली लाइनों पर कार्य करें।
चुनौती यह है कि इसे 'एफडी' पढ़ने के लिए पुनरावृत्ति प्रकृति का उपयोग करना चाहिए और 100+ एमबी रेंज में फ़ाइलों को संभालने में सक्षम होना चाहिए।
अद्यतन - इस प्रश्न के लिए अंक प्राप्त करने के लिए अपने जल्दबाजी में आप एक आयात भाग को अनदेखा कर रहे हैं, जो स्मृति उपयोग है। उदाहरण अभिव्यक्ति के लिए:
non_blank_lines = (line.strip() for line in fd if line.strip())
स्मृति में पूरी फ़ाइल बफ़र होना, नहीं एक पट्टी() कार्रवाई दो बार प्रदर्शन का उल्लेख करने के लिए जा रहा है। जो छोटी फाइलों के लिए काम करेगा, लेकिन जब आपके पास 100 + एमबी डेटा (या एक बार 100 जीबी में) हो तो विफल हो जाता है।
चुनौती का एक हिस्सा निम्नलिखित काम करता है, लेकिन पढ़ने के लिए सूप है: जादू लोगों के लिए
for line in ifilter(lambda l: l, imap(lambda l: l.strip(), fd)):
queue.write(json.loads(line))
देखो!
अंतिम अद्यतन: PEP-289 [] और() के बीच अंतर की अपनी बेहतर समझ के लिए बहुत उपयोगी है।
यह आपके प्रश्न का बिल्कुल जवाब नहीं है, लेकिन बड़ी फ़ाइलों के लिए, आप IO (http://neopythonic.blogspot.com/2008/10/sorting-million-32-bit buffered करने के लिए एक नज़र डालना चाहते हैं -इंटरर्स-इन -2mb.html) – BorrajaX
मैं वास्तव में एक बेहतर तरीके से नहीं सोच सकता। केवल एक चीज जो आप कर सकते हैं वह आपके 'fd' ऑब्जेक्ट के लिए अपना' __iter__' फ़ंक्शन लिखना है (जिसे आपने हमें अधिक जानकारी नहीं दी है) ताकि वह केवल आपकी उबाऊ हो जो खाली नहीं हो। – jdotjdot
एफडी बहुत आसान है: '' खुला (FILENAME) के साथ fd: '' – koblas