एक फ़ाइल की शुरुआत में लिखना जो आप केवल अंत में जानते हैं


9

पृष्ठभूमि: मैं ईबीएमएल फ़ाइल लिखने के लिए माइक्रो कंट्रोलर सी कोड लिख रहा हूं। EBML नेस्टेड तत्वों के साथ एक बाइनरी एक्सएमएल की तरह है, लेकिन स्टार्ट और एंड टैग के बजाय, एक स्टार्ट आईडी, लंबाई और फिर डेटा है। मैं इसे कम बिजली के अनुप्रयोग में बाहरी फ्लैश में लिख रहा हूं, इसलिए मैं फ्लैश एक्सेस को न्यूनतम रखना चाहता हूं। मेमोरी भी सीमित है, क्योंकि कुछ भी कभी भी आसान नहीं है।

जब मैं पूरे ईबीएमएल तत्व को स्मृति में रख सकता हूं, तो इसे बनाना आसान है क्योंकि मैं वापस जाने के बाद प्रत्येक तत्व की लंबाई में भर सकता हूं क्योंकि मुझे पता है कि लंबाई क्या है। समस्या यह है कि क्या करना है जब मैं पूरे तत्व को स्मृति में नहीं रख सकता। मेरे द्वारा देखे जाने वाले विकल्प हैं:

  • जो मैं जानता हूं उसे लिखें, फिर वापस जाएं और लंबाई में जोड़ दें (सबसे आसान, लेकिन मैं चाहता हूं कि अधिक फ्लैश एक्सेस जोड़ता है)
  • प्रत्येक तत्व की लंबाई की गणना करें इससे पहले कि मैं इसे लिखना शुरू कर दूं (अपेक्षाकृत आसान, लेकिन बहुत प्रोसेसर समय)
  • एक बार मेरी मेमोरी को भरने के लिए मोड स्विच करें, ताकि मैं फिर डेटा के माध्यम से जारी रखूं, लेकिन केवल पहले से ही मेमोरी में आरक्षित तत्वों के लिए लंबाई की गणना करने के लिए। फिर याद रखें कि मेरे पास क्या है, और वापस जाएं और उस डेटा को संसाधित करना जारी रखें जहां से मैंने छोड़ा था। (मेरा अब तक का पसंदीदा विकल्प)
  • तत्वों को एक अधिकतम या सबसे खराब स्थिति दें जब उन्हें लिखने की आवश्यकता हो और उनकी अंतिम लंबाई अभी तक ज्ञात नहीं है। (ऊपर की तुलना में आसान है, लेकिन बैकफ़ायर और बेकार जगह)

प्रश्न: ऐसा लगता है कि यह एक अपेक्षाकृत सामान्य मुद्दा होना चाहिए जिसके बारे में लोगों ने सोचा है। मुझे पता है कि कुछ डेटा पैकेट बनाते समय भी ऐसा हो सकता है। क्या मैं एक बेहतर / अधिक सामान्य / अधिक स्वीकृत तकनीक हूं जो मैं यहां याद कर रहा हूं? या इस मुद्दे के लिए कुछ शर्तें जिन्हें मैं खोज सकता हूं?


1
/ sccs इस तरह काम करता है: यह लिखने के बाद फाइल की शुरुआत में सभी बाइट्स का चेकसम लिखता है। उन यूनिक्स पर बहुत अच्छा काम करता है जो जरूरत के मुताबिक फाइल ऑपरेशन कर सकते हैं (जैसे सोलारिस) और यूनिक्स पर अजीब छिटपुट मुद्दे पैदा कर सकते हैं जो ऐसा नहीं कर सकते, जैसे लिनक्स
gnat

जवाबों:


2

यदि आप नहीं जानते हैं कि आपका पेलोड कितना लंबा होगा, तो शायद ही कभी चिंता का कारण हो, भले ही आप स्थिति को याद न रख सकें और बाद में लंबाई को पीछे छोड़ दें:

बस "अज्ञात आकार" पर ध्यान दें।

यह सुविधा ईबीएमएल-तत्वों से युक्त पेलोड पर निर्भर करती है और निम्नलिखित तत्व हालांकि वैध बाल-तत्व नहीं है।

यदि आप चाहें, तो आप बाद में अपनी इच्छानुसार परिणामी EBML को अपनी इच्छानुसार ऑफ़लाइन कर सकते हैं, उदाहरण के लिए "कोई अज्ञात आकार, न्यूनतम आकार" या "न्यूनतम आकार, अज्ञात आकारों से बचें"।


विवरण के लिए matroska.org पर EBML RFC ड्राफ्ट देखें।


यह भी खूब रही! यह कुछ ऐसा है जिसके बारे में मुझे जानकारी नहीं थी और यह मुख्य समस्या से बचा जाता है, लेकिन मैं अभी भी कोर समस्या को हल करने के लिए एक अच्छे तरीके से मार्गदर्शन करना चाहूंगा। अज्ञात आकार के तत्व का उपयोग करने से ऐसा लगता है कि यह भविष्य की अनुकूलता को सीमित कर सकता है, क्योंकि पुराने सॉफ्टवेयर समय से पहले नए तत्वों से बाहर निकल जाएंगे।
Pscheidler

आपको सही DTD की आवश्यकता है या आप वास्तव में EBML को डीकोड नहीं कर सकते हैं। ठीक है, अगर सभी अज्ञात तत्व आकार में हैं, तो आप उन्हें छोड़ सकते हैं, लेकिन क्या यह पर्याप्त है? बस किसी भी EBML को पोस्ट-प्रोसेस करें जिसे आप ऑफलाइन स्टोर करना चाहते हैं।
Deduplicator 20

हम अपने स्वयं के स्कीमा का उपयोग कर रहे हैं, जो विस्तार करेगा। यह इस ज्ञान के साथ डिजाइन किया गया है कि पुराने सॉफ्टवेयर को अंततः कुछ डेटा पर छोड़ना पड़ सकता है। लेकिन यह ईबीएमएल की एक बड़ी विशेषता है जिससे मैं अनजान था, इसलिए मैं इसका उत्तर स्वीकार करता हूं।
साइकेडलर

0

यदि निश्चित संख्याओं के साथ एकल तत्व बहुत बड़ा है, तो शायद आपको इसे स्कीमा में विभाजित करने का प्रयास करना चाहिए। मैं इस प्रारूप को नहीं जानता, लेकिन संभवत: आप इसमें अधिकतम लेन-देन को परिभाषित कर सकते हैं।

अनुक्रमों के लिए आप अगली फ़ाइल में शेष सबलेमेंट्स की अधिकतम संख्या और "स्ट्रीम" को परिभाषित करने का प्रयास कर सकते हैं

संभावित रूप से अधिकतम मेमोरी साइज़ से अधिक वाले तत्वों के लिए एक स्टैक युक्त जोड़े तैयार करें: आरक्षित तत्व की लंबाई का स्थान और लंबाई का काउंटर। पॉप ऑन करंट काउंटर को करंट मार्कर में सेव करें और अगले काउंटर पर इसकी वैल्यू जोड़ें।

सामान्य तौर पर बहुत बड़े तत्वों की संख्या को कम करने की कोशिश करते हैं


ठीक है, वह शायद अपने खुद के ईबीएमएल तत्वों के लिए कर सकता है, लेकिन यह अभी भी मूल तत्व के साथ उसकी मदद नहीं करता है।
डेडुप्लिकेटर

आपका विचार काम करेगा, लेकिन मैं एक ऐसी प्रणाली बनाऊंगा जो स्कीमा को विवश करने के बजाय बड़े तत्वों को संभाल सके, ताकि वह इन तत्वों से बच सके।
Pscheidler

यह समाधान बड़े तत्वों के लिए भी काम करेगा, बस स्टैक के आकार के साथ सावधानी रखें। और अगर यह स्कीमा की बात आती है ... तो इसे एक ऐसी भाषा के रूप में सोचें जिसे आपके अनुप्रयोग उपयोग कर रहे हैं, यदि कोई एक जटिल को संभाल नहीं सकता है, तो दूसरे को समायोजित करना चाहिए या एक अनुवादक की आवश्यकता है। कई डेवलपर्स (कम से कम C / C ++ वाले जिन्हें मैं जानता हूं) स्कीमा / डिज़ाइन परिवर्तनों से बचने की प्रवृत्ति रखते हैं जैसे कि यह एक आग थी, जिसके परिणामस्वरूप बाद में खराब व्यवस्था होती है। यदि अन्य घटक समायोजित करने में असमर्थ है, तो शायद यह खराब रूप से विघटित / डिज़ाइन किया गया है। यदि बदलने के लिए अन्य कारण नहीं हैं, तो आपको संभवतः एक अलग हार्डवेयर के उपयोग पर विचार करना चाहिए
व्हॉट

0

चुंबन और YAGNI।
विकल्प # 1 चुनें और अगर यह एक वास्तविक समस्या बन जाती है - केवल तब उस पर दोहराएं।

कम से कम समान द्विआधारी स्वरूपों के साथ समान उपयोग के मामलों के लिए, जब केवल कुछ मूल्यों को इस तरह से भरना होता था, तो यह सबसे सरल / आसान / सबसे अच्छा समाधान होता है। यदि आपको डेटा के प्रत्येक और प्रत्येक भाग पर ऐसा करना है - तो यह वास्तुकला में एक दोष हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.