मेरा संदर्भ जैव सूचना विज्ञान है, विशेष रूप से अगली पीढ़ी अनुक्रमित है, लेकिन समस्या सामान्य है; तो मैं एक उदाहरण के रूप में एक लॉग फ़ाइल का उपयोग करेंगे।हास्केल: क्या मैं स्मृति में सूची रखे बिना एक ही आलसी सूची में कई गुना कर सकता हूं?
फ़ाइल बहुत बड़ी (गीगाबाइट, बड़े संकुचित, तो यह स्मृति में फिट नहीं होगा) है, लेकिन पार्स करने के लिए (प्रत्येक पंक्ति एक प्रविष्टि है) आसान है, तो हम आसानी से की तरह कुछ लिख सकते हैं:
parse :: Lazy.ByteString -> [LogEntry]
अब, मेरे पास बहुत सारे आंकड़े हैं जिन्हें मैं लॉग फ़ाइल से गणना करना चाहता हूं। इन सभी के रूप foldl' k z . map f
के हैं
totalEntries = length
nrBots = sum . map fromEnum . map isBotEntry
averageTimeOfDay = histogram . map extractHour
: यह इस तरह के रूप में अलग कार्यों लिखने के लिए सबसे आसान है।
समस्या यह है कि अगर मैं की तरह
main = do
input <- Lazy.readFile "input.txt"
let logEntries = parse input
totalEntries' = totalEntries logEntries
nrBots' = nrBots logEntries
avgTOD = averageTimeOfDay logEntries
print totalEntries'
print nrBots'
print avgTOD
, सबसे प्राकृतिक तरीके से इस्तेमाल करने की कोशिश यह स्मृति में पूरी सूची आवंटित करेगा, जो कि मैं क्या नहीं करना चाहता है। मैं चाहता हूं कि गुना सिंक्रनाइज़ किया जाए, ताकि विपक्षी कोशिकाओं को कचरा इकट्ठा किया जा सके। अगर मैं केवल एक ही आंकड़े की गणना करता हूं, तो यही होता है।
मैं ऐसा एक बड़ा फ़ंक्शन लिख सकता हूं जो यह करता है, लेकिन यह गैर-संगत कोड है।
वैकल्पिक रूप से, जो है मैं, क्या कर रहे हैं मैं एक अलग से पारित चलाते हैं, लेकिन इस & पुन: लोड फ़ाइल हर बार uncompresses।
आप क्यों नहीं बनाते हैं कर रहे हैं 'logAnalysers :: [(कश्मीर, जेड, एफ)]' जहां 'के, जेड, एफ' आपके उदाहरण में 'k, z, f' कार्यों के प्रकार हैं? फिर यह "संगत" कोड बन जाता है, यदि आपके पास एक एकल गुना है जो सूची का उपयोग करता है। – dflemstr
@dflemstr इंटरमीडिएट प्रकार हमेशा समान नहीं होते हैं :( – luispedro
आप * लॉग * एनालिस :: [फोरल एबीसी। (बी -> सी -> बी, सी, ए -> बी)] ', जो कि अनुमति देगा विभिन्न प्रकार ... – dflemstr