2013-05-29 12 views
6

में तारों की 2-जीबी सूची में है या नहीं, मेरे पास 2 जीबी की एक बड़ी फ़ाइल (A.txt) है जिसमें स्ट्रिंग्स ['Question','Q1','Q2','Q3','Ans1','Format','links',...] की एक सूची है।जांचें कि क्या स्ट्रिंग पाइथन

अब मैं एक और बड़ा फ़ाइल (1TB) 2 की स्थिति में ऊपर उल्लेख किया स्ट्रिंग से युक्त है:

आउटपुट:

a, Question, b 
The, quiz, is 
This, Q1, Answer 
Here, Ans1, is 
King1, links, King2 
programming,language,drupal, 
..... 

मैं लाइनों जिसका दूसरे स्थान सूची में स्ट्रिंग से युक्त बनाए रखना चाहते फ़ाइल A.txt में संग्रहीत। यही है, मैं (एक और फाइल में स्टोर) बनाए रखने के लिए नीचे उल्लेख लाइनों हैं:

a, Question, b 
This, Q1, Answer 
Here, Ans1, is 
King1, links, King2 

मैं जानता हूँ कि यह कैसे करना है जब फ़ाइल में सूची की लंबाई (a.txt) 100..using 'है कोई'। लेकिन मुझे यह नहीं मिल रहा है कि फ़ाइल में सूची की लंबाई (एटीटीटी) 2 जीबी होने पर मुझे इसके बारे में कैसे जाना चाहिए।

उत्तर

8

सूची का उपयोग न करें; इसके बजाय एक सेट का उपयोग करें।

एक सेट में पहली फ़ाइल पढ़ें:

with open('A.txt') as file_a: 
    words = {line.strip() for line in file_a} 

0,5 शब्दों के जीबी नहीं कि ज्यादा एक सेट में स्टोर करने के लिए है।

if second_word in words: 
    # .... 

ओपन लाइन द्वारा दूसरी फ़ाइल और इस प्रक्रिया में यह लाइन, शायद csv मॉड्यूल का उपयोग कर यदि लाइनों शब्द अल्पविराम से अलग कर रहे हैं:

अब आप words के खिलाफ हे (1) में लगातार समय परीक्षण कर सकते हैं।

शब्दों के एक बड़े समूह के लिए, डेटाबेस का उपयोग करें; अजगर sqlite3 पुस्तकालय के साथ आता है:

import sqlite3 

conn = sqlite3.connect(':memory:') 
conn.execute('CREATE TABLE words (word UNIQUE)') 

with open('A.txt') as file_a, conn: 
    cursor = conn.cursor() 
    for line in file_a: 
     cursor.execute('INSERT OR IGNORE INTO words VALUES (?)', (line.strip(),)) 

तो उस के खिलाफ टेस्ट:

cursor = conn.cursor() 
for line in second_file: 
    second_word = hand_waving 
    cursor.execute('SELECT 1 from words where word=?', (second_word,)) 
    if cursor.fetchone(): 
     # .... 

यहां तक ​​कि मैं एक :memory: डेटाबेस यहाँ का उपयोग हालांकि, SQLite बहुत चालाक अस्थायी फ़ाइलों में डेटा संग्रहीत करने के लिए जब आप को भरने शुरू याद। :memory: कनेक्शन मूल रूप से केवल एक अस्थायी, एक-ऑफ डेटाबेस है। यदि आप शब्द डेटाबेस का दोबारा उपयोग करना चाहते हैं तो आप वास्तविक फ़ाइलपैथ का भी उपयोग कर सकते हैं।

+1

ऐसा लगता है कि 0.5 जीबी बस एक संपादन में 2 जीबी तक कूद गया ... –

+0

@ जोनक्लेमेंट्स: फ़ॉलबैक विकल्प, एसक्लाइट। –

+0

वास्तव में आवश्यक नहीं है लेकिन क्वेरी को IN/ANY या EXISTS के रूप में फिर से लिखा जा सकता है - या यदि किसी के पास एक लाल या समान सर्वर आसान है जो अच्छी तरह से काम करेगा ... –

1

Martijn Pieters द्वारा उत्तर के साथ प्रारंभ करें। यदि यह बहुत धीमा है तो आप डेटाबेस का उपयोग करने की संख्या को कम करने के लिए Bloom Filter का उपयोग कर सकते हैं, जो लाइनों को समाप्त कर सकते हैं जो आपकी सूची में किसी भी शब्द से मेल नहीं खा सकते हैं। पायथन एक अंतर्निहित hash function के साथ आता है जिसे आप फिल्टर तालिका में हैश में से किसी एक के लिए उपयोग कर सकते हैं, और आप किसी अन्य संख्या को देख सकते हैं।

+0

+1 मदद के लिए धन्यवाद –

संबंधित मुद्दे