फ़ाइल मान देता है इतनी बड़ी है कि आप रैम में फिट करने के लिए खर्च नहीं उठा सकते है। उसके बाद, आप Reservoir Sampling, एक एल्गोरिथ्म अज्ञात, मनमाने ढंग से लंबाई की सूची है कि स्मृति में फिट नहीं हो सकता से बेतरतीब ढंग से उठा संभालने के लिए तैयार किया गया है का उपयोग करना चाहते हैं:
Random r = new Random();
int currentLine = 1;
string pick = null;
foreach (string line in File.ReadLines(filename))
{
if (r.Next(currentLine) == 0) {
pick = line;
}
++currentLine;
}
return pick;
एक उच्च स्तर पर, जलाशय नमूना एक बुनियादी नियम इस प्रकार है: प्रत्येक आगे की रेखा में सभी पिछली लाइनों को बदलने का 1/एन मौका है।
इस एल्गोरिथ्म थोड़ा unintuitive है। एक उच्च स्तर पर, यह होने लाइन एन से काम करता है वर्तमान में चयनित पंक्ति को बदला के एक 1/एन मौका है। इस प्रकार, लाइन 1 का चयन करने का 100% मौका है, लेकिन 50% बाद में लाइन 2 द्वारा प्रतिस्थापित किया जा रहा है।
मुझे इस एल्गोरिदम को शुद्धता के सबूत के रूप में सबसे आसान माना गया है। तो, प्रेरण द्वारा एक सरल सबूत:
1) बेस मामला: निरीक्षण करके, एल्गोरिथ्म काम करता है, अगर वहाँ 1 लाइन।
2) यदि एल्गोरिदम एन -1 लाइनों के लिए काम करता है, तो एन लाइनों को संसाधित करता है क्योंकि:
3) एन लाइन फ़ाइल के एन -1 पुनरावृत्तियों को संसाधित करने के बाद, सभी एन -1 लाइन समान रूप से संभावना (संभावना 1/(एन -1))।
4) अगले चरण सुनिश्चित करता है कि लाइन एन (1/एन की सम्भावना है, क्योंकि है कि क्या एल्गोरिथ्म स्पष्ट रूप से इसे प्रदान करती है, और यह अंतिम यात्रा है), के लिए सभी पिछले लाइनों की संभावना को कम करने:
1/(N-1) * (1-(1/N))
1/(N-1) * (N/N-(1/N))
1/(N-1) * (N-1)/N
(1*(N-1))/(N*(N-1))
1/N
यदि आप जानते हैं कि फ़ाइल में कितनी लाइनें पहले से हैं, तो यह एल्गोरिदम आवश्यक से अधिक महंगा है, क्योंकि यह हमेशा पूरी फ़ाइल को पढ़ता है।
फ़ाइल में एक यादृच्छिक ऑफसेट की तलाश करें, फिर एक न्यूलाइन चरित्र के लिए आगे स्कैन करें। अगली नई लाइन तक डेटा पढ़ें। फ़ाइल के अंत के साथ अपनी सावधानी बरतें। यदि लाइनों में बड़ी लंबाई भिन्नता है तो संभावना एक समान नहीं होगी। ओह, और 5000 नहीं है * वह * बहुत ;-) –
प्रत्येक 100 लाइनों के साथ 50 फाइलों को तोड़ें, फ़ाइल के लिए यादृच्छिक numb 0-50, लाइन के लिए यादृच्छिक रेखा 0-99। ऐसा कहकर, हर 5 मिनट में 5000 लाइनों को पढ़ना अभी भी एक बड़ा मुद्दा नहीं है ... कुशल नहीं, बल्कि असली मुद्दा नहीं। यदि यह ऐप के साथ आपकी एकमात्र समस्या है, तो आप अच्छे हैं :) – Noctis
कुल में फ़ाइल कितनी बड़ी है? – olydis