2009-07-28 10 views
5

मैं वर्तमान में अपने जावा प्रोजेक्ट में JSON (gzip के माध्यम से संपीड़ित) का उपयोग कर रहा हूं, जिसमें मुझे बड़ी संख्या में ऑब्जेक्ट्स स्टोर करने की आवश्यकता है (सैकड़ों लाखों) डिस्क पर। मेरे पास प्रति पंक्ति एक JSON ऑब्जेक्ट है, और JSON ऑब्जेक्ट के भीतर लाइनब्रैक को अस्वीकार करता है। इस तरह मैं पूरी फ़ाइल को एक बार में पढ़ने के बिना डिस्क लाइन-दर-रेखा से डेटा स्ट्रीम कर सकता हूं।एक तेज, कॉम्पैक्ट, स्ट्रीम करने योग्य, बहु भाषा, दृढ़ता से टाइप किए गए क्रमबद्धता प्रारूप

यह पता चला है कि जेएसओएन कोड (http://www.json.org/java/ का उपयोग करके) को डिस्क से कच्चे डेटा को खींचने या इसे डिकंप्रेस करने (या जो मैं उड़ता हूं) से बड़ा ओवरहेड है।

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

इसे क्रॉस-प्लेटफ़ॉर्म होने की भी आवश्यकता होगी। मैं जावा का उपयोग करता हूं, लेकिन PHP, पायथन और अन्य भाषाओं का उपयोग करने वाले लोगों के साथ काम करता हूं।

तो, संक्षिप्त करने के लिए, यह होना चाहिए:

  • जोरदार टाइप किया
  • स्ट्रीम (यानी यह सब एक ही बार में रैम में लोड किए बिना थोड़ा करके एक फाइल बिट पढ़ें।)
  • क्रॉस मंच (जावा और PHP सहित)
  • फास्ट
  • नि: शुल्क (भाषण में के रूप में)

कोई संकेतक?

+0

यदि डिस्क से कच्चे डेटा को खींचना तेज है, तो ऐसा क्यों नहीं करते? जेएसओएन के साथ गड़बड़ क्यों धीमी है? –

+0

ठीक है, इसलिए पार्सिंग जेसन डिकंप्रेसिंग से धीमा है, या डिस्क से डेटा को पढ़ रहा है। तो क्या? क्या आपको इसके लिए बहुत धीमी गति है? या आप इसके लिए सिर्फ अनुकूलित कर रहे हैं? – Breton

+0

ब्रेटन: मुझे जो करना है, उसके लिए यह बहुत धीमा है, यह समयपूर्व अनुकूलन नहीं है। – sanity

उत्तर

8

आप Google प्रोटोकॉल बफ़र्स को देखा ?: है

http://code.google.com/apis/protocolbuffers/

वे पार मंच (सी ++, जावा, पायथन) पीएचपी भी के लिए तीसरे पक्ष बाइंडिंग के साथ कर रहे हैं। यह तेज़, काफी कॉम्पैक्ट और दृढ़ता से टाइप किया गया है।

वहाँ भी यहां विभिन्न स्वरूपों के बीच एक उपयोगी तुलना दी गई है:

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

आप बचत विचार करना चाह सकते हैं या अन्य लोगों में से एक के रूप में अच्छी तरह से यहाँ उल्लेख किया।

+0

... और, Google इसका समर्थन कर रहा है। –

2

आप YAML- http://www.yaml.org/

पर एक नज़र ले सकता है यह JSON का सुपरसेट है, तो डेटा फ़ाइल संरचना आप परिचित हो जाएगा। यह कुछ अतिरिक्त डेटा प्रकारों के साथ-साथ उन संदर्भों का उपयोग करने की क्षमता का समर्थन करता है जिनमें एक डेटा संरचना का एक हिस्सा दूसरे में शामिल होता है।

मुझे कोई विचार नहीं है कि यह "पर्याप्त तेज़" होगा - लेकिन libyaml पार्सर (सी में लिखा गया) बहुत अस्पष्ट लगता है।

+0

जबकि यमल जेएसओएन का सुपरसैट नहीं है, मैं मानता हूं कि यह सबसे ज्यादा पढ़ने योग्य/कॉम्पैक्ट/टाइप किए गए प्रारूप में से एक है जिसे मैं जानता हूं। – gizmo

+0

यामल जेसन की तुलना में अधिक जटिल है। मुझे लगता है कि ज्यादातर कार्यान्वयन धीमे हैं। – troelskn

+0

AFAIK, हां, कार्यान्वयन बहुत प्रदर्शन नहीं कर रहे हैं। वाईएएमएल कुछ हद तक अलग-अलग लक्ष्यों, अधिकतम अभिव्यक्ति और इतने पर, गति या सादगी की दिशा में तैयार नहीं है। – StaxMan

3

मैं Jackson

जैक्सन के साथ JSON को पार्स बहुत अच्छे परिणाम मिला है एक है:

  • स्ट्रीमिंग (पढ़ना, लेखन)
  • फास्ट (किसी अन्य जावा JSON पार्सर की तुलना में तेजी होने के लिए मापा जाता और डेटा बाइंडर)
  • शक्तिशाली (सामान्य जेडीके कक्षाओं के साथ-साथ किसी भी जावा बीन वर्ग, संग्रह, मानचित्र या एनम के लिए पूर्ण डेटा बाध्यकारी)
  • शून्य-निर्भर cy (JDK से परे अन्य संकुल पर निर्भर नहीं करता)
  • मुक्त स्रोत (LGPL या AL)
  • पूरी तरह से अनुरूप

JSON प्रोसेसर (JSON पार्सर + JSON जनरेटर) जावा में लिखा। मूल जेएसओएन पढ़ने/लिखने (पार्सिंग, जेनरेटिंग) से परे, यह पूर्ण नोड-आधारित वृक्ष मॉडल, साथ ही पूर्ण ओजेएम (ऑब्जेक्ट/जेसन मैपर) डेटा बाध्यकारी कार्यक्षमता भी प्रदान करता है।

इसके performance कई अन्य धारावाहिक विकल्पों की तुलना में बहुत अच्छा है।

+0

किसी और चीज की कोशिश करने से पहले जैक्सन का प्रयोग करें। Json.org पर कोड उत्पादन के उपयोग के लिए उपयुक्त नहीं है। –

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