2013-06-11 8 views
6

इसलिए मुझे 4 पूर्णांक का एक सेट रिकॉर्ड करने की आवश्यकता है जिनके मूल्य दिन के हर दूसरे के लिए अलग हैं। यानी .:एक बड़ी टेक्स्ट फ़ाइल में एक पंक्ति को संपादित करना

#Here the values are initialized to the same value, however they will change as samples are taken 
data = [[.25 for numData in range(4)] for numSecs in range(86400)] 

अब स्पष्ट रूप से एक दो आयामी सरणी (अपने अजगर, सूची गाह) जिनकी पहली सूचकांक लंबाई है 86400 काफी अव्यावहारिक है। इसके बजाय मैं एक पाठ फ़ाइल बनाना चाहते हैं 86400 लाइनों जैसे स्वरूपित:

numSec data0 data1 data2 data3 

0 .25 .25 .25 .25 
1 .25 .25 .25 .25 
2 .25 .25 .25 .25 
... 

और के रूप में नमूने ले जाया जाता है, मैं इस फ़ाइल को संपादित करने में सक्षम होना चाहते हैं, अस्वीकार, मैं की लाइन संपादित करने में सक्षम होना चाहता हूँ फ़ाइल जिसका numSec = दूसरा नमूना लिया गया था। उदाहरण के लिए, एक नमूना numSec में लिया = 2 (आधी रात के बाद 2 सेकंड) मेरा कार्यक्रम कि इतने फ़ाइल को संपादित करने का कारण होता है:

0 .25 .25 .25 .25 
1 .25 .25 .25 .25 
2 .70 .10 .10 .10 
... 

काफी आसान लगता है, मेरे पास भी पदों जो प्रदर्शन किया के एक झुंड कैसे पढ़ एक पाठ फ़ाइल में एक एकल को फिर से लिखें। समस्या यह है कि, सभी को आवश्यकता है कि आप पूरी फाइल में पढ़ लें। मैं नहीं चाहता कि मेरा कार्यक्रम प्रति सेकंड 86,400 लाइनें पढ़े।

इस प्रकार हम अपने प्रश्न पर पहुंचते हैं: क्या मैं एक पाठ फ़ाइल में एक पंक्ति पढ़ सकता हूं, इसे संपादित कर सकता हूं, और फाइल को वापस लिख सकता हूं, बिना किसी बदलाव की पूरी फाइल को हर बार पढ़ने के बिना?

पीएस मुझे ध्यान रखना चाहिए कि मैं उबंटू 12.04 (सटीक) चला रहा हूं और यह आरओएस नोड

पीपीएस में उपयोग के लिए है, यह प्रोग्राम मनमाने ढंग से दिनों के लिए चल रहा है, इसलिए डेटा के प्रत्येक "दूसरे" को कई बार पढ़ा और फिर से लिखा जा सकता है । एक और कारण यह है कि मैं एक फ़ाइल का उपयोग करना चाहता हूं अगर सिस्टम को बंद करने की आवश्यकता है, तो मैं अगली बार चलाने के लिए वितरण को सहेजना चाहता हूं।

+7

यदि फ़ाइल में प्रत्येक प्रविष्टि की लंबाई तय हो गई है, तो शायद 'mmap'। अन्यथा, डेटाबेस पर विचार करें। – Jokester

+0

यदि प्रत्येक प्रविष्टि की निश्चित लंबाई होती है, तो आप बस बाइनरी मोड में फ़ाइल खोल सकते हैं, ऑफसेट की गणना कर सकते हैं, 'तलाश' और 'लिखित' जगह पर।(यह वास्तव में पाठ मोड में भी काम करेगा, जब तक आप न्यूलाइन और चार चौड़ाई को ध्यान में रखते हैं, लेकिन यह तकनीकी रूप से अवैध है।) हालांकि, 'mmap' शायद सरल हो रहा है, इसलिए जोकर को +1 करें। – abarnert

+1

आपको क्या लगता है कि 5 संख्याओं के 86400 सेट स्टोर करना एक समस्या है? किसी भी घटना में, आपको प्रति सेकंड औसतन फ़ाइल का आधा लिखना होगा। साथ ही, पिछली पंक्ति के तुरंत बाद प्रत्येक सेकेंड लाइन से निपटने वाला होगा - क्यों सब कुछ याद में रखें? – Neil

उत्तर

3

आप और इस थोड़ा संशोधित करना पड़ सकता यह मान लेते हैं कि सभी लाइनों एक ही लंबाई के होते हैं। इसके लिए, मुझे पहले कॉलम को निश्चित चौड़ाई तक पैड करना था। लेकिन अगर आप पैडिंग नहीं चाहते हैं तो आपको 1,2,3,4 की संख्या की गणना करने में सक्षम होना चाहिए, .. किसी विशेष पंक्ति से पहले अंकों की संख्या।

data = [[.25 for numData in range(4)] for numSecs in range(86400)] 
length_line=0 

def write_line(f, sec, data): 
    line="{:6d}".format(sec) + " " +" ".join(
      ["{:.2f}".format(dd) for dd in data])+"\n" 
    f.write(line) 
    return len(line) 

with open('output', 'w') as of: 
    for i,d in enumerate(data): 
     length_line=write_line(of, i, d) 

with open('output', 'rb+') as of: 
    # modify the 2nd line: 
    n = 2 
    of.seek(n*length_line) 
    write_line(of, n, [0.10,0.10,0.10,0.10]) 
    # modify the 10th line: 
    n = 10 
    of.seek(n*length_line) 
    write_line(of, n, [0.10,0.10,0.10,0.10]) 
+0

आपके उत्तर के लिए धन्यवाद, जबकि मुझे कुछ परेशानी है decyphering write_line (चिंता न करें मैं इसे समझूंगा) मुझे लगता है कि आप अभी भी दो आयामी सरणी घोषित कर रहे हैं। पढ़ने/लिखने की समस्या उस संरचना से बचने के लिए है, इस प्रकार अनावश्यक पढ़ने/लिखने का उपयोग शामिल है। मुझे लगता है कि मेरे पास एक नया सवाल है, क्या 5 संख्याओं के 86400 सेट वास्तव में एक अंतरिक्ष हॉग के बड़े नहीं हैं? – RoboCop87

+0

@ RoboCop87, मैंने इसे परीक्षण के लिए आउटपुट फ़ाइल को पॉप्युलेट करने के लिए घोषित किया। आपको बिल्कुल 2 डी सरणी की आवश्यकता नहीं है। लेकिन आपको प्रारंभिक फ़ाइल लिखनी होगी। हालांकि उस संरचना को 10 एमबी से कम का उपयोग करना चाहिए। – perreal

+0

मुझे यकीन नहीं है कि क्या आप आरओएस से परिचित हैं (मैं निश्चित रूप से नहीं हूं, और मुझे इसका उपयोग करना चाहिए) लेकिन जो मैं समझता हूं उससे यह एक ही समय में कई कार्यक्रम चलाता है और यह आपके सिस्टम पर बहुत कर लगा रहा है । मुझे यकीन नहीं है कि इस तरह की प्रणाली पर 10 एमबी कितना प्रभाव डालता है, यही कारण है कि मैं फ़ाइल का उपयोग करके सावधान रहने की कोशिश कर रहा था। क्या यह कंप्यूटिंग के दायरे में मुश्किल से एक झपकी होगी? या इससे कोई फर्क पड़ता है? – RoboCop87

2

लाइनों अलग-अलग लंबाई के हैं, तो संशोधित पंक्ति के बाद सब कुछ गलत स्थिति में होगा और आप उन सभी लाइनों को फिर से लिखने के लिए है। यदि लाइनों में सभी समान लंबाई हैं, तो आप फ़ाइल में लाइन ऑफसेट की गणना करके seek() और write() नया डेटा कर सकते हैं। अधिक जानकारी के लिए Python File Objects देखें।

0

मुझे यकीन नहीं है कि यह 345600 (86400 * 4) बार 0.25 स्टोर करने में उपयोगी है या नहीं। बस पहली पंक्ति में डिफ़ॉल्ट स्टोर करें। एक समय में एक लाइन जोड़ना। यदि टाइम स्टैंप क्रम में नहीं आते हैं तो बस उन्हें अंदर रखें और दिन के बाद फ़ाइल सामग्री को एक बार खत्म कर दें और डिफ़ॉल्ट समय के साथ लापता समय टिकटों को भरें। उदाहरण:

default: 0.25 
2 .70 .10 .10 .10 
3 .80 .20 .20 .20 
1 .50 .30 .30 .30 
5 .40 .30 .30 .30 

बाद में प्रक्रिया इस फाइल को इसे पाने के लिए:

1 .50 .30 .30 .30 
2 .70 .10 .10 .10 
3 .80 .20 .20 .20 
4 .25 .25 .25 .25 
5 .40 .30 .30 .30 
+0

मैं देख रहा हूं कि आप क्या कह रहे हैं, हालांकि यह कार्यक्रम मनमाने ढंग से दिनों के लिए चल रहा है, इसलिए एक समय में केवल एक को जोड़ना एक प्रभावी समाधान नहीं होगा। – RoboCop87

0

अगर मैं तुम्हें थे, मैं रिकॉर्ड स्टोर करने के लिए एक SQLite डेटाबेस का प्रयोग करेंगे। कुंजी अवलोकन का दूसरा होगा और प्रत्येक पंक्ति में 4 मान होंगे। अद्यतन और संपादन अधिक कुशल होगा।

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