2010-03-29 13 views
12

प्रोजेक्ट में मैं वर्तमान में काम कर रहा हूं कि डिस्क पर एक बड़ी डेटा संरचना को सहेजने की आवश्यकता है (संपादित करें: एमबी के दर्जनों को सोचें)। आशावादी होने के नाते, मैंने सोचा कि ऐसी समस्या के लिए एक मानक समाधान होना चाहिए;संस्करण अनुकूल, विस्तारणीय बाइनरी फ़ाइल प्रारूप

  1. .NET 2.0 समर्थन, अधिमानतः एक FOSS कार्यान्वयन
  2. संस्करण अनुकूल (इस रूप में व्याख्या की जानी चाहिए साथ: एक पुराने संस्करण पढ़ने हालांकि, अब तक मैं एक समाधान है जो निम्न आवश्यकताओं को संतुष्ट नहीं मिला है अंतर्निहित डेटा संरचना में परिवर्तन सरल हैं, यदि फ़ील्ड जोड़ने/छोड़ने का कहना सरल है)
  3. यादृच्छिक पहुंच के कुछ रूपों को करने की क्षमता जहां प्रारंभिक निर्माण के बाद डेटा का हिस्सा बढ़ाया जा सकता है, आवश्यकता के बिना इस बिंदु पर बनाए गए संग्रह को deserialize करने के लिए (मध्यवर्ती परिणामों के विस्तार के रूप में इस बारे में सोचें)
  4. अंतरिक्ष और कुशल समय (एक्सएमएल विकल्प के रूप में शामिल नहीं किया गया है इस आवश्यकता को देखते हुए)

विकल्प अब तक माना जाता:

  • XmlSerializer: एक्सएमएल क्रमबद्धता के बाद से ठुकरा दिया गया था आवश्यकता 3 और 4
  • को पूरा नहीं करता
  • SerializableAttribute: का समर्थन नहीं करता आवश्यकताओं 2 और 3
  • Protocol Buffers: के बारे में दस्तावेज़ Large Data Sets के फैसले से ठुकरा दिया गया था - के बाद से इस टिप्पणी को एक और परत ओ जोड़ने का सुझाव दिया एन शीर्ष, यह अतिरिक्त जटिलता के लिए कॉल करेगा जिसे मैं फ़ाइल प्रारूप द्वारा ही संभालना चाहता हूं।
  • HDF5, EXI: नहीं करता है: .net कार्यान्वयन
  • SQLite/SQL Server Compact edition है लगता नहीं है: हाथ में डेटा संरचना एक बहुत जटिल तालिका संरचना है कि बहुत लक्षित उपयोग
  • BSON के लिए दिग्गज लगता है में परिणाम होगा समर्थन की आवश्यकता के लिए प्रतीत होता है 3.
  • Fast Infoset: ऐसा लगता है कि .NET कार्यान्वयन का भुगतान किया गया है।

कोई भी सिफारिश या पॉइंटर्स की बहुत सराहना की जाती है। इसके अलावा यदि आप मानते हैं कि उपर्युक्त जानकारी में से कोई भी सत्य नहीं है, तो कृपया मुझे गलत साबित करने के लिए पॉइंटर्स/उदाहरण प्रदान करें।

+0

एचडीएफ 5 में कुछ .NET समर्थन है: http://www.hdfgroup.org/projects/hdf.net/ –

+0

@ रिचर्ड मॉर्गन अब तक मुझे केवल .NET धन्यवाद के संबंध में hdfgroup.org पर मृत लिंक मिले हैं। –

+0

hdf.net के साथ आपूर्ति किए गए उदाहरण को देखते हुए, यह विचार है कि .NET असुरक्षित और कस्टम मार्शलिंग का उपयोग कर रहा है, कोई मजा नहीं। –

उत्तर

6

क्या आपने SQL Server Compact Edition का उपयोग करने पर विचार किया है?

  1. इसमें .NET समर्थन
  2. स्कीमा के संस्करण और आपके आवेदन पुराने स्कीमा से निपटने के लिए अपने नियंत्रण में पूरी तरह से किया जाएगा के नए संस्करणों के लिए क्षमता के बहुत सारे है। SQL सर्वर कॉम्पैक्ट का संस्करण किसी नए संस्करण में सुविधाओं का उपयोग करके आपके एप्लिकेशन से परे कुछ हद तक प्रतीत होना चाहिए जो पुराने संस्करण में मौजूद नहीं था।
  3. आपके पास पूछताछ के लिए आपके लिए उपलब्ध SQL वाक्यविन्यास का अधिकांश हिस्सा है।
  4. स्पष्ट रूप से नाम से, SQL सर्वर का यह संस्करण एम्बेडेड सिस्टम के लिए डिज़ाइन किया गया था जिसमें SQL Express की स्थापना या SQL सर्वर के पूर्ण उड़ा संस्करण से बचने के लिए अनुप्रयोग शामिल हो सकते हैं।

अब, यह, कि डेटा संरचना में SQLite रूप में एक ही मुद्दों के लिए होता है से क्या आप ने हमें बताया है, जटिल हो सकता है, लेकिन यह सच है भले ही आप आप द्विपदीय प्रारूप ही रोल किया जाएगा।

Btw, यह मेरे लिए होता है कि आप स्पष्ट नहीं किया है कि क्या वास्तव में "बड़ा" का क्या मतलब है। यदि "आकार देने योग्य" का अर्थ है 4 जीबी के करीब या उससे अधिक, स्पष्ट रूप से एसक्यूएल कॉम्पैक्ट काम नहीं करेगा और न ही अन्य डेटाबेस फ़ाइल स्वरूपों का एक मेजबान होगा।

EDIT मुझे लगता है कि आपने अपनी पोस्ट के बाद "बहुत भारी वजन" सूची में अपनी SQL सूची कॉम्पैक्ट संस्करण जोड़ा है। एसक्यूएल कॉम्पैक्ट को डेटाबेस के आकार के आधार पर केवल 5 एमबी रैम और 2 एमबी डिस्क स्टोरेज की आवश्यकता होती है। तो, समस्या हेवीवेट नहीं हो सकती है। अब, डेटा संरचना का दावा करने के दूसरे बिंदु के रूप में काफी जटिल होगा। यदि यह सच है, तो मुझे संदेह है कि यह किसी भी संबंधित डेटाबेस उत्पाद के बारे में सच होगा और आपके स्वयं के बाइनरी प्रारूप को रोल करना और भी जटिल होगा। यह देखते हुए, आप mongodb जैसे गैर-संबंधपरक डेटाबेस उत्पादों को देख सकते हैं।

+1

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

+0

मैं इसके साथ बोर्ड पर हूं। यदि आप लगातार डेटा तक कुशल यादृच्छिक पहुंच चाहते हैं तो आपको डेटाबेस की आवश्यकता है, शायद या तो रिलेशनल या केवीपी। यह वही है जो डाटाबेस * के लिए * हैं। यह वास्तव में मानक है और सभी 4 आवश्यकताओं को पूरा करने लगता है - और एसक्यूएल सीई/एसक्यूएलसाइट "हेवीवेट" से बहुत दूर है। – Aaronaught

1

क्या आप (बी) JSON पर विचार करेंगे? यदि ऐसा है, तो दस्तावेज़-उन्मुख डेटाबेस में से एक आपकी आवश्यकताओं के अनुरूप हो सकता है। CouchDB एक JSON दस्तावेज़ स्टोर है जिसमें एक आरईएसटी एपीआई (निश्चित रूप से .NET से उपयोग योग्य) है। कॉच डीबी दस्तावेजों में द्विआधारी अनुलग्नक हो सकते हैं और मैंने उन लोगों से बात की है जिन्होंने बिना किसी मुद्दे के दस्तावेज़ों में बहु-एमबी संलग्नक संग्रहीत किए हैं। मेरा मानना ​​है कि MongoDB, एक वैकल्पिक दस्तावेज़ डेटाबेस जो बाइनरी JSON को स्टोरेज प्रारूप के रूप में उपयोग करता है, में भी नेट बाइंडिंग है।

ये "NoSQL" विकल्प आसानी से संस्करणीकृत क्योंकि वे अनिवार्य रूप से स्कीमा से मुक्त हैं कर रहे हैं। जेएसओएन काफी कॉम्पैक्ट है, और वे निश्चित रूप से मौजूदा डेटा के अपडेट की अनुमति देते हैं।

+0

कृपया ध्यान दें कि बीएसओएन को छोड़े गए विकल्पों में से एक के रूप में सूचीबद्ध किया गया है, इसके अलावा मैं बाइनरी ब्लब्स स्टोर नहीं करना चाहता, लेकिन नेट डेटा संरचनाएं जो काफी बड़ी हो सकती हैं लेकिन कई हिस्सों में शामिल हैं। –

+0

बीजेएसओएन डिस्क प्रारूप पर एक कार्यान्वयन विस्तार है। इस उपयोग के लिए यह काफी कुशल है। आप निश्चित रूप से मोंगो डीबी में एक दस्तावेज़ को आसानी से बढ़ा सकते हैं या अपडेट कर सकते हैं, आवश्यकता 3 पर अपने बहिष्कार को अस्वीकार कर सकते हैं। आप एक मोंगोडीबी दस्तावेज़ में डेटा संरचना को क्रमबद्ध कर सकते हैं जिसे आप क्वेरी कर सकते हैं आदि डिस्क पर कोई भी डिस्क डिस्क पर बाइनरी बीएलओबी है। यह या कोई स्टोरेज योजना एक तार्किक अमूर्त है जो डिस्क स्टोर के साथ काम करना आसान बनाता है। मुझे नहीं लगता कि आपको दस्तावेज़ डेटाबेस की तुलना में कुछ भी बेहतर मिलेगा। –

+0

मुझे लगता है कि एक दस्तावेज आधारित nosql db जैसे mongo आवश्यकताओं को ठीक करेगा + यदि आवश्यक हो तो आपको बोनस के रूप में स्केलेबिलिटी विकल्प मिलते हैं। – Brimstedt

0

क्या आपने बाइनरी क्रमबद्धता को देखा है?

अधिक जानकारी के लिए मेरी पोस्ट here देखें। इसमें एक शब्दकोश ऑब्जेक्ट में निहित कस्टम क्लास को क्रमबद्ध करने के लिए नमूना कोड है। सुनिश्चित नहीं है कि आपकी संरचना कितनी जटिल है, लेकिन यह आपकी आवश्यकताओं के अनुरूप इसे अनुकूलित करने के लिए काफी आगे होनी चाहिए।

एक टिप्पणी जोड़ें आप और अधिक मदद की जरूरत है ...

+0

मेरा नवीनतम संपादन देखें मुझे बाइनरी/एक्सएमएल-सीरियलाइजेशन के बारे में पता है लेकिन दोनों विकल्प बंद कर दिए गए थे। –

+0

ठीक है, लेकिन बाइनरी serialization! = एक्सएमएल serialization। मैं अभी भी इसे देखता हूं। – GalacticJello

0

एक्सएमएल अंतरिक्ष सेवन से उत्पन्न आवश्यकताओं को पूरा नहीं करता है, तो आप एक System.IO.Compression.DeflateStream के माध्यम से एक्सएमएल फ़ीड इसका आकार कम कर सकते हैं। Deflate एल्गोरिदम अनिवार्य रूप से GZip संपीड़न जैसा ही है, लेकिन 40% तक तेज हो सकता है (Jeff Atwood's blog देखें)।

+0

एक्सएमएल तलाश योग्य नहीं है (कोई अनुक्रमण नहीं) और संपीड़ित धाराएं/फ़ाइलें या तो तलाश योग्य नहीं हैं। –

0

मैं प्रोटोकॉल बफर को इतनी जल्दी लिख नहीं पाऊंगा। निश्चित रूप से, आपके द्वारा संदर्भित मैन्युअल प्रविष्टि मेगाबाइट के आदेश के बारे में बताती है, और आप मेगाबाइट के दसियों से निपट रहे हैं ... लेकिन क्या आपने यह देखने के लिए एक अध्ययन करने की कोशिश की है कि यह सीमा आपको प्रभावित करती है या नहीं?

यदि यह अभी भी आपको प्रभावित करता है, तो मेरा सुझाव एक संकर दृष्टिकोण के साथ जाना है: टुकड़ा और अपने डेटा को 1 एमबी आकार के टुकड़ों में सेट करें, और उसके बाद प्रत्येक खंड को SQLite तालिका के क्षेत्र के रूप में स्टोर करें (एक बाइनरी ब्लॉब के रूप में)। उन तत्वों के लिए तालिका में अन्य फ़ील्ड जोड़ें जिन्हें आप इंडेक्स करना चाहते हैं (या द्वारा खोज)।

हां, यह जटिलता को जोड़ता है, लेकिन ऐसा कुछ और नहीं है जहां आपको जाना है।

1

क्या आपने db4o जैसे कुछ माना है? लाइसेंसिंग आपको प्रतिबंधित कर सकती है लेकिन यह बिल को अन्यथा फिट करने लगती है।

1

यहाँ के बारे में सोच के लिए एक दिलचस्प विकल्प है: सिस्को, अपाचे लाइसेंस के अंतर्गत उपलब्ध से खोदना विचार खोदना उपयोग कर रहा है के घटकों के बीच संवाद करने के लिए (आप कोई रॉयल्टी का भुगतान करने और अपने सॉफ्टवेयर वाणिज्यिक बनी हुई है और तुम्हारा।)

अपने एक बाइनरी रूप में प्रणाली। प्रारूप संस्करण परिवर्तनों के लिए लचीला है, और आपकी आवश्यकताओं की स्थिति के रूप में गायब फ़ील्ड इत्यादि को संभाल सकता है।

लाभ यह है कि आप बाइनरी प्रारूप के शीर्ष पर एक और पूर्ण स्थानांतरण प्रणाली प्राप्त करते हैं। इसे बहुत तेज़ माना जाता है (प्रति मशीन 900 एसओएपी एक्सएमएल लेनदेन करने वाली मशीन, 50,000 ईटीएचसी लेनदेन करती है)।

यदि आपको एकाधिक सूचकांक की आवश्यकता है तो आप एक हल्के आरडीबीएमएस में बिनराइज फॉर्म स्टोर कर सकते हैं। यदि केवल एक सूचकांक पर्याप्त होगा, तो एक साधारण कुंजी/मूल्य स्टोर (वितरित वातावरण के लिए कॉच डीबी/मोंगोडीबी या यहां तक ​​कि कैसंद्रा) आपको अद्भुत भंडारण प्रदर्शन भी देगा!

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