2012-09-26 16 views
37

मैं वस्तुओं को क्रमबद्ध करने के लिए जेएसओएन और बीएसओएन की तुलना कर रहा हूं। इन वस्तुओं में बड़ी संख्या में पूर्णांक के कई सरणी होते हैं। मेरे परीक्षण में जिस ऑब्जेक्ट में मैं क्रमबद्ध हूं, इसमें कुल 12,000 पूर्णांक हैं। मुझे केवल दिलचस्पी है कि आकार क्रमबद्ध परिणामों की तुलना कैसे करते हैं। मैं JSON.NET का उपयोग लाइब्रेरी के रूप में कर रहा हूं जो क्रमबद्धता करता है। मैं JSON का उपयोग कर रहा हूं क्योंकि मैं जावास्क्रिप्ट में इसके साथ काम करने में भी सक्षम होना चाहता हूं।जेएसओएन और बीएसओएन की तुलना करें

JSON स्ट्रिंग का आकार लगभग 43 केबी है और बीएसओएन का आकार 161 केबी है। तो 4 के बारे में एक अंतर कारक। यह मेरी अपेक्षा नहीं है क्योंकि मैंने बीएसओएन को देखा क्योंकि मैंने सोचा था कि बीएसओएन डेटा संग्रहित करने में अधिक कुशल है।

तो मेरा सवाल यह है कि बीएसओएन कुशल नहीं है, क्या इसे और अधिक कुशल बनाया जा सकता है? या क्या बड़ी संख्या में पूर्णांक वाले सरणी वाले डेटा को क्रमबद्ध करने का एक और तरीका है, जिसे जावास्क्रिप्ट में आसानी से संभाला जा सकता है?

नीचे आपको जेएसओएन/बीएसओएन क्रमबद्धता का परीक्षण करने के लिए कोड मिल गया है।

 // Read file which contain json string 
     string _jsonString = ReadFile(); 
     object _object = Newtonsoft.Json.JsonConvert.DeserializeObject(_jsonString); 
     FileStream _fs = File.OpenWrite("BsonFileName"); 
     using (Newtonsoft.Json.Bson.BsonWriter _bsonWriter = new BsonWriter(_fs) 
       { CloseOutput = false }) 
     { 
      Newtonsoft.Json.JsonSerializer _jsonSerializer = new JsonSerializer(); 
      _jsonSerializer.Serialize(_bsonWriter, _object); 
      _bsonWriter.Flush(); 
     } 

संपादित करें:

यहाँ जिसके परिणामस्वरूप फ़ाइलें https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-ZZp8C_0gcR0

+3

आप कम संख्या का एक बहुत है, तो यह एक 32- या 64-बिट पूर्णांक के रूप में की तुलना में एक भी ASCII बाइट के रूप में उदाहरण के लिए भेजने के लिए, "2" तार के पार और अधिक कुशल हो सकता है (क्रमशः 4 और 8 बाइट्स)। क्या यह संभव है कि यह (या कुछ समान) आपके डेटा की संपत्ति है? –

+0

अगर मैं इसे सही ढंग से समझता हूं, तो ASCII/UTF-8 के साथ एन्कोडिंग मैं जेएसओएन के साथ इस समय कर रहा हूं। पूर्णांक के सरणी वाले ऑब्जेक्ट को जेएसओएन प्रारूप में स्ट्रिंग में क्रमबद्ध किया जाता है। यह स्ट्रिंग तब तार पर भेज दी जाती है या यूटीएफ -8 में एन्कोडेड डिस्क में सहेजी जाती है। इसलिए संख्या ASCII/UTF-8 बाइट्स के रूप में भेजी जाती है। अगर मैं गलत हूं कृपया मुझे सही। – Ronald

+0

[यहां] (https://coderwall.com/p/ccdryg) php में एक साफ प्रदर्शन बेंचमार्क बीटीडब्ल्यू जेसन और बीसन है। साथ ही, [प्रोटोकॉल-बफर-बनाम-जेसन-या-बीसन] देखें (http://stackoverflow.com/questions/2000933/protocol-buffers-versus-json-or-bson) – nawfal

उत्तर

62

JSON की दक्षता बनाम BSON पूर्णांकों आप भंडारण कर रहे हैं के आकार पर निर्भर कर रहे हैं। एक दिलचस्प बिंदु है जहां एएससीआईआई वास्तव में पूर्णांक प्रकारों को संग्रहीत करने से कम बाइट लेता है। 64-बिट पूर्णांक, यह आपके बीएसओएन दस्तावेज़ को कैसा लगता है, 8 बाइट्स ले लो। आपकी संख्या 10,000 से कम है, जिसका अर्थ है कि आप प्रत्येक को एएससीआईआईआई में 4 बाइट्स (99 99 के माध्यम से प्रत्येक चरित्र के लिए एक बाइट) में स्टोर कर सकते हैं। वास्तव में, आपका अधिकांश डेटा 1000 से कम की तरह दिखता है, जिसका अर्थ है कि इसे 3 या कम बाइट्स में संग्रहीत किया जा सकता है। बेशक, उस deserialization समय लगता है और सस्ता नहीं है, लेकिन यह अंतरिक्ष बचाता है। इसके अलावा, जावास्क्रिप्ट सभी संख्याओं का प्रतिनिधित्व करने के लिए 64-बिट मानों का उपयोग करता है, इसलिए यदि आप प्रत्येक पूर्णांक को अधिक उपयुक्त डेटाफॉर्मेट में परिवर्तित करने के बाद बीएसओएन को लिखते हैं, तो आपकी बीएसओएन फ़ाइल बहुत बड़ी हो सकती है।

spec के अनुसार, बीएसओएन में बहुत सी मेटाडेटा है जो JSON नहीं करता है। इस मेटाडाटा ज्यादातर लंबाई उपसर्गों ताकि आप डेटा के माध्यम से छोड़ सकते हैं आप में कोई दिलचस्पी नहीं कर रहे हैं उदाहरण के लिए, निम्न डेटा ले:। यदि आप JSON का उपयोग कर रहे, अब

["hello there, this is an necessarily long string. It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.", 
"oh man. here's another string you still don't care about. You really just want the third element in the array. How long are the first two elements? JSON won't tell you", 
"data_you_care_about"] 

, तो आप पूरी तरह पार्स करने के लिए है पहले दो तारों में से पता लगाने के लिए कि तीसरा स्थान कहां है। आप BSON उपयोग करते हैं, आप (नहीं, बल्कि वास्तव में क्योंकि मैं उदाहरण के लिए इस मार्कअप ऊपर बना रहा हूं) मार्कअप अधिक की तरह मिल जाएगा:

[175 "hello there, this is an necessarily long string. It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.", 
169 "oh man. here's another string you still don't care about. You really just want the third element in the array. How long are the first two elements? JSON won't tell you", 
19 "data_you_care_about"] 

तो अब, आप पढ़ सकते हैं '175', पता 175 बाइट्स को आगे छोड़ने के लिए, फिर '16 9' पढ़ें, 16 9 बाइट्स को छोड़ दें, और फिर '1 9' पढ़ें और अपनी स्ट्रिंग में अगले 19 बाइट्स कॉपी करें। इस तरह आपको डिलीमीटर के लिए तारों को पार्स करने की भी आवश्यकता नहीं है।

दूसरे बनाम एक का उपयोग करना आपकी आवश्यकताओं के आधार पर बहुत निर्भर है। यदि आप दुनिया भर में पार्स करने के लिए हर समय भारी दस्तावेज संग्रहित करने जा रहे हैं, लेकिन आपकी डिस्क स्थान सीमित है, तो JSON का उपयोग करें क्योंकि यह अधिक कॉम्पैक्ट और अंतरिक्ष कुशल है। यदि आप दस्तावेजों को संग्रहित करने जा रहे हैं, लेकिन कुछ डिस्क स्थान बचाने से प्रतीक्षा समय (शायद सर्वर संदर्भ में) को कम करना आपके लिए अधिक महत्वपूर्ण है, तो बीएसओएन का उपयोग करें।

आपकी पसंद में विचार करने के लिए एक और चीज मानव पठनीयता है। यदि आपको बीएसओएन युक्त क्रैश रिपोर्ट को डीबग करने की आवश्यकता है, तो आपको शायद इसे समझने के लिए उपयोगिता की आवश्यकता होगी। आप शायद बीएसओएन को नहीं जानते हैं, लेकिन आप सिर्फ JSON पढ़ सकते हैं।

FAQ

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