2013-08-10 4 views
14

यदि मुझे केस वर्गों का घोंसला वाला ऑब्जेक्ट ग्राफ़ मिला है, तो नीचे दिए गए उदाहरण के समान, और मैं उन्हें लाल रंग की सूची में संग्रह संग्रहित करना चाहता हूं, मुझे कौन से पुस्तकालयों या औजारों को देखना चाहिए उस पर रेडिस के लिए सबसे तेज़ समग्र दौर यात्रा होगी?स्कैला केस कक्षाओं का सबसे तेज़ क्रमिकरण/deserialization

यह शामिल होंगे:

  • समय आइटम धारावाहिक डेटा
  • समय संग्रहीत पुन: प्राप्त करने के

  • नेटवर्क लागत मामले कक्षाओं में वापस deserialize करने के लिए धारावाहिक डेटा स्थानांतरित करने का
  • नेटवर्क लागत क्रमानुसार करने

    case class Person(name: String, age: Int, children: List[Person]) {} 
    

उत्तर

25

अद्यतन (2018): स्कैला/पिकलिंग अब सक्रिय रूप से बनाए रखा नहीं गया है। अन्य पुस्तकालयों के संग्रह हैं जो वैकल्पिक रूप से उत्पन्न होते हैं जो समान दृष्टिकोण लेते हैं लेकिन जो विशिष्ट धारावाहिक प्रारूपों पर ध्यान केंद्रित करते हैं; उदाहरण के लिए, जेएसओएन, बाइनरी, प्रोटोबफ।

आपके उपयोग के मामले में बिल्कुल स्केला/अचार बनाने (https://github.com/scala/pickling) के लिए लक्षित उपयोग है। अस्वीकरण: मैं एक लेखक हूं।

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

नवीनतम मानक हमारे OOPSLA paper में कर रहे हैं - द्विआधारी अचार प्रारूप के लिए (आप भी, दूसरों के लिए चुन सकते हैं JSON की तरह) स्केला/अचार बनाने जावा और Kryo से लगातार तेजी से होता है, और बाइनरी अभ्यावेदन कि समतुल्य हैं या की तुलना में छोटे Kryo के पैदा करता है , जिसका मतलब नेटवर्क पर आपके मसालेदार डेटा को पार करते समय कम विलंबता है। http://lampwww.epfl.ch/~hmiller/pickling

और एक ScalaDays 2013 talk from June on Parley's:

अधिक जानकारी के लिए, वहाँ एक परियोजना पृष्ठ है।

हम स्ट्रेंज लूप 2013 में नेटवर्क पर क्लोजर भेजने से निपटने से संबंधित कुछ नए विकास भी पेश करेंगे, यदि आपके उपयोग के मामले में दर्द का दर्द भी हो सकता है।

इस लेखन के समय, स्कैला/पिकलिंग प्री-रिलीज में है, हमारी पहली स्थिर रिलीज 21 अगस्त के लिए योजनाबद्ध है।

+0

यह काफी उपयोगी है, लेकिन GitHub पेज थोड़ा छोटा है। मैं निश्चित रूप से उन दृश्यों पर एक नज़र डालेगा और उत्तर के लिए धन्यवाद। – user2668128

+0

* लिंक। बीटीडब्ल्यू, जेएसओएन प्रदर्शन के लिए सबसे अच्छा प्रारूप है, या यह सिर्फ जीथूब पर उदाहरण था? – user2668128

+1

हाँ, हम प्रलेखन पर काम कर रहे हैं। रिलीज के साथ अगले सप्ताह या दो में उपयोग निर्देशों के लिए और अधिक होगा। हमारा बाइनरी प्रारूप हमारा सबसे प्रदर्शन-ट्यून प्रारूप है। हालांकि JSON भी बहुत तेज़ होना चाहिए (हमने अभी तक JSON के लिए व्यापक मानक प्रकाशित नहीं किए हैं)। –

6

अद्यतन:

आप JDK से serialize तरीकों का उपयोग करने के लिए सावधान रहना चाहिए। प्रदर्शन बहुत अच्छा नहीं है और आपकी कक्षा में एक छोटा सा परिवर्तन डेटा को deserialize करने में असमर्थ कर देगा।


मैंने स्कैला/पिकलिंग का उपयोग किया है, लेकिन सीरियलाइजिंग/deserializing जबकि यह एक वैश्विक ताला है।

तो यह उपयोग करने के बजाय, मैं इस तरह अपने ही क्रमांकन/deserialization कोड लिखें:

import java.io._ 

object Serializer { 

    def serialize[T <: Serializable](obj: T): Array[Byte] = { 
    val byteOut = new ByteArrayOutputStream() 
    val objOut = new ObjectOutputStream(byteOut) 
    objOut.writeObject(obj) 
    objOut.close() 
    byteOut.close() 
    byteOut.toByteArray 
    } 

    def deserialize[T <: Serializable](bytes: Array[Byte]): T = { 
    val byteIn = new ByteArrayInputStream(bytes) 
    val objIn = new ObjectInputStream(byteIn) 
    val obj = objIn.readObject().asInstanceOf[T] 
    byteIn.close() 
    objIn.close() 
    obj 
    } 
} 

यहाँ यह का उपयोग करने का एक उदाहरण है:

case class Example(a: String, b: String) 

val obj = Example("a", "b") 
val bytes = Serializer.serialize(obj) 
val obj2 = Serializer.deserialize[Example](bytes) 
संबंधित मुद्दे