2011-01-19 18 views
9

मेरे पास विभिन्न प्रकार के समृद्ध डेटा संरचनाएं हैं (मुख्य रूप से पेड़) कि मैं डिस्क पर बने रहना चाहता हूं, जिसका अर्थ है कि मैं न केवल उन्हें डिस्क पर लिखना चाहता हूं, लेकिन मुझे गारंटी है कि डेटा पूरी तरह से लिखा गया है और एक शक्ति से बच जाएगा -down।आप .NET से डिस्क पर डेटा कैसे बनाते हैं?

दूसरों माता पिता से बच्चे नोड्स देखने तालिकाओं के रूप में फ्लैट डेटाबेस तालिकाओं में समृद्ध डाटा संरचनाओं सांकेतिक शब्दों में बदलना करने के लिए तरीके डिजाइन करने के लिए लग रहे हैं। यह डेटा के खिलाफ SQL क्वेरी चलाने में सुविधा प्रदान करता है लेकिन मुझे इसके लिए कोई आवश्यकता नहीं है: मैं बस अपने पेड़ों को सहेजना और लोड करना चाहता हूं।

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

अंत में, मैं तो नेट से बने डेटा के लिए एक टर्नकी समाधान आदर्श होगा एफ # से कर रहा हूँ ...

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

+1

पुन "टर्नकी समाधान" - कुछ (सभी नहीं) F # संरचनाएं * सामान्य * खिड़की से बाहर हो सकती हैं जो कई दृढ़ता परतों से अपेक्षित होती है - एक डीटीओ कक्षा परत (केवल serialization से पहले) का उपयोग करना स्वीकार्य होगा अगर यह चीजों को सरल बनाता है? इसके अलावा - मुझे संदेह है कि आप * धारावाहिक * और * एसीआईडी ​​* पहलुओं को अलग से देखना चाहते हैं। –

+1

यदि (रीड पर आपकी टिप्पणी को देखते हुए) क्रमबद्धता पहलू कोई मुद्दा नहीं है, तो शायद कोई ACID * दस्तावेज़ * डेटाबेस। –

+0

@Marc: "एसीआईडी ​​दस्तावेज़ डेटाबेस"। बढ़िया, धन्यवाद! –

उत्तर

9

.NET की फ़ाइलस्ट्रीम कक्षा के कुछ रचनाकार FileOptions प्रकार का पैरामीटर लेते हैं। FileOptions के मानों में से एक लिखेंथ्रू, जो "इंगित करता है कि सिस्टम को किसी भी मध्यवर्ती कैश के माध्यम से लिखना चाहिए और सीधे डिस्क पर जाना चाहिए।"

यह आपके लिखने आपरेशन सुनिश्चित करना चाहिए कि जब तक (एक नई फाइल करने के लिए) रिटर्न, डेटा डिस्क के लिए प्रतिबद्ध है और आप सुरक्षित रूप से पुराने फ़ाइल को नष्ट कर सकते हैं।

+0

बिल्कुल सही, धन्यवाद! –

+2

उत्तर के लिए धन्यवाद। मुझे उन फाइलों के विवरणों के बारे में कभी पता नहीं था: WriteThrough, Asynchronous, RandomAccess, DeleteOnClose, SequentialScan, और एन्क्रिप्टेड। उनमें से प्रत्येक को देखकर एक अच्छा ब्लॉग पोस्ट लायक हो सकता है। – Cygwin98

7

यह Serialization के माध्यम से किया जा सकता है।

.NET Framework में बाइनरी या एक्सएमएल-आधारित प्रारूपों का उपयोग करने सहित डिस्क में आपके डेटा को क्रमबद्ध करने के लिए कई अंतर्निहित विकल्प शामिल हैं। एमएसडीएन दस्तावेज़ीकरण में विस्तृत How-To articles प्रदान किए जाते हैं।

+0

एक्सएमएलसेरियलाइज़र के लायक हो सकता है, कई एफ # प्रकारों, विशेष रूप से रिकॉर्ड और भेदभाव वाले यूनियनों के साथ काम नहीं करेगा, क्योंकि इनके पास डिफ़ॉल्ट पैरामीटर रहित इंस्टेंस कन्स्ट्रक्टर नहीं हैं। यह दुर्भाग्यपूर्ण है, क्योंकि भेदभाव वाले संघ पेड़ मॉडलिंग का एक शानदार तरीका प्रदान करते हैं। बाइनरी सीरियलाइजेशन सबसे प्रत्यक्ष दृष्टिकोण – pblasucci

+0

@pblasucci है: ट्रू - बाइनरी सीरियलाइजेशन (या एक कस्टम सीरियलाइज़र) की आवश्यकता हो सकती है यदि आप F # –

+0

@Reed का उपयोग कर रहे हैं: दृढ़ता की गारंटी के बारे में मेरे प्रश्न के लिए प्रारूपण के बारे में यह उत्तर कैसे है? एफ # रिकॉर्ड्स के लिए –

0

XMLSerializer (System.Xml.Serialization) का उपयोग करने का प्रयास करें।

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

यह स्वचालित रूप से उनके गुणों के आधार पर जटिल डेटा संरचनाओं बच सकते हैं, और आप, उत्पादन को नियंत्रित करने के विशेषताओं का उपयोग यदि आप चाहें तो कर सकते हैं:

http://msdn.microsoft.com/en-us/library/83y7df3e.aspx

+0

XMLSerializer कई F # प्रकारों, विशेष रूप से रिकॉर्ड और भेदभाव वाले यूनियनों के साथ काम नहीं करेगा, क्योंकि इनके पास डिफ़ॉल्ट पैरामीटर रहित इंस्टेंस कन्स्ट्रक्टर नहीं हैं। यह दुर्भाग्यपूर्ण है, क्योंकि भेदभाव वाले संघ पेड़ मॉडलिंग का एक शानदार तरीका प्रदान करते हैं। बाइनरी क्रमबद्धता सबसे प्रत्यक्ष दृष्टिकोण है। – pblasucci

+0

@ सी। लॉरेंस वेनहम: डिस्क पर गारंटीकृत दृढ़ता के बारे में मेरे प्रश्न के लिए प्रासंगिक स्वरूपण के बारे में यह उत्तर कैसे है? न तो एक्सएमएल सीरिएलाइज़र और न ही कोई अन्य धारावाहिक इस तरह की गारंटी देता है, AFAIK। –

+0

डिस्क पर लिखने की कोई गारंटी नहीं है, आपको बाद में जांच करनी होगी कि कोई अपवाद नहीं था, कि फ़ाइल मौजूद है और शून्य बाइट्स नहीं है। आप एक कस्टम क्लास में System.Transactions.IEnlistmentNotification को कार्यान्वित कर सकते हैं जो आपके लिखने को एक वितरित लेनदेन में सूचीबद्ध करेगा, हालांकि, अगर आपको –

3

ऐसा करने में, आपको एक संसाधन की आवश्यकता होगी जो आपको Transaction में संलग्न करने की अनुमति देगा (अधिकतर नहीं, आप TransactionScope का उपयोग करेंगे।

अधिकांश डेटाबेस यदि कोई निहित है तो Transaction में भाग लेंगे। डिस्क ऑपरेशंस को Transaction द्वारा भी प्रबंधित किया जा सकता है, लेकिन आपको कुछ specific work in order to utilize it in .NET करना होगा।

यह भी ध्यान दें कि यह केवल Windows Vista और बाद में उपलब्ध है।

यदि आप डेटाबेस मार्ग पर जाते हैं, तो आप अपने पेड़ों की धारावाहिक सामग्री को ब्लॉब (या पाठ, धारावाहिक तंत्र के आधार पर) में संग्रहीत कर सकते हैं।

ध्यान दें, आप भी एसक्यूएल सर्वर में FILESTREAM कार्यक्षमता का उपयोग कर सकते हैं (2008 और ऊपर, मेरा मानना ​​है) फाइल सिस्टम और एसक्यूएल सर्वर में लेनदेन का लाभ पाने पर अपनी फ़ाइलें संग्रहीत करने के लिए।

1

मैंने एफ # से पहले db4o का उपयोग नहीं किया है, लेकिन यह लेन-देन तरीके से डिस्क पर सीएलआर ऑब्जेक्ट ग्राफ़ को जारी रखने के बारे में है। यदि यह रिकॉर्ड और भेदभाव संघों के साथ काम करता है, तो यह आपके अनुरूप हो सकता है।

संपादित करें: मैंने अभी डीबी 4o 8.0 (.NET 4 संस्करण) का परीक्षण किया है और ऐसा लगता है कि रिकॉर्ड प्रकारों और भेदभाव वाले यूनियन पदानुक्रमों को पूरी तरह से अच्छी तरह से संभाला जाता है।

0

थोड़ा OT के रूप में ओ पी एक्सएमएल नहीं करना चाहता था, लेकिन देखने वाले अन्य लोगों एक्सएमएल फ़ॉर्मेटर ... आपको शाब्दिक हठ चाहते हैं, SoapFormatter मामलों संभालती उल्लेख (चक्र/वस्तु रेखांकन) कि डिफ़ॉल्ट एक्सएमएल फ़ॉर्मेटर करता है नहीं - इसका एक्सएमएल XMLFormatter के रूप में पठनीय नहीं है, लेकिन यह बाइनरी से अधिक पठनीय है :)

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