2012-02-23 18 views
7

मैं निम्नलिखित स्काला कोड चल रहा हूँ:यह स्कैला कोड क्यों धीमा है?

import scala.util.parsing.json._ 
import scala.io._ 

object Main { 
     def jsonStringMap(str: String) = 
       JSON.parseFull(str) match { 
         case Some(m: Map[_,_]) => m collect { 
             // If this doesn't match, we'll just ignore the value 
             case (k: String, v: String) => (k,v) 
           } toMap 
         case _ => Map[String,String]() 
       } 

     def main(args: Array[String]) { 
       val fh = Source.fromFile("listings.txt") 
       try { 
         fh.getLines map(jsonStringMap) foreach { v => println(v) } 
       } finally { 
         fh.close 
       } 
     } 
} 

मेरी मशीन पर यह http://sortable.com/blog/coding-challenge/ से फाइल पर ~ 3 मिनट लगते हैं। समतुल्य हास्केल और रूबी कार्यक्रम जो मैंने लिखा था 4 सेकंड के भीतर लेते हैं। मैं क्या गलत कर रहा हूं?

मैंने मानचित्र के बिना एक ही कोड की कोशिश की (jsonStringMap) और यह बहुत तेज़ था, तो क्या JSON पार्सर वास्तव में धीमा है?

ऐसा लगता है कि डिफ़ॉल्ट JSON पार्सर वास्तव में धीमा है, हालांकि मैंने https://github.com/stevej/scala-json की कोशिश की और जब यह 35 सेकंड तक हो जाता है, यह रूबी की तुलना में अभी भी धीमा है।

अब मैं https://github.com/codahale/jerkson का उपयोग कर रहा हूं जो भी तेज है! मेरा प्रोग्राम अब मेरे डेटा पर केवल 6 सेकंड में चलता है, रूबी की तुलना में केवल 3 सेकंड धीमा है, जो शायद जेवीएम शुरू हो रहा है।

+0

शायद codereview.stackexchange.com – Nettogrof

+0

के लिए बेहतर फिट है, ऐसा लगता है कि आप स्वतंत्र रूप से प्रत्येक पंक्ति को पार्स कर रहे हैं। क्या आपने पूरे JSON दस्तावेज़ के लिए एक बार पार्सर का आह्वान करने का प्रयास किया है? –

+0

@ChrisShain मैं पूरी फ़ाइल को JSON दस्तावेज़ में बदल सकता हूं, लेकिन (ए) मुझे नहीं लगता कि यह तेज़ कैसे होगा, यह फ़ाइल से लाइनों को स्ट्रीम नहीं कर सकता है, लेकिन इसे सब करना होगा एक बार में (बी) रूबी में ऐसा ही क्यों कर रहा है जैसा कि बहुत तेज़ हो रहा है? – singpolyma

उत्तर

8

स्कैला-उपयोगकर्ता संग्रह पर एक त्वरित नज़र से संकेत मिलता है कि स्केल मानक पुस्तकालय में JSON पार्सर के साथ कोई भी गंभीर कार्य नहीं कर रहा है।

देखें http://groups.google.com/group/scala-user/msg/fba208f2d3c08936

यह पार्सर मानक पुस्तकालय में एक समय में समाप्त हो गया जब स्केला सुर्खियों में कम था और अपेक्षाओं को यह आज है नहीं था लगता है।

import com.github.seanparsons.jsonar._ 
import scala.io.Source 
def parseLines[T](file: String, transform: (Iterator[String]) => T): T = { 
    val log = Source.fromFile(file) 
    val logLines = log.getLines() 
    try { transform(logLines) } finally { log.close } 
} 
def parseFile(file: String) = parseLines(file, (iterator) => iterator.map(Parser.parse(_)).toList) 
parseFile("products.txt"); parseFile("listings.txt") 

लेकिन, जैसा कि किसी को उल्लेख किया है, इसे और अधिक उपयोगी सिर्फ एक JSONArray के रूप में पूरी बात को पार्स बजाय अलग-अलग की बहुत सारी करने के लिए होगा:

2

my JSON library का उपयोग करना, मैं दोनों फ़ाइलों की एक लगभग तात्कालिक पार्स मिल लाइनों के रूप में यह करता है।

3

Jerkson का उपयोग करें। जेर्कसन जैक्सन का उपयोग करता है जो कि जेवीएम पर सबसे तेज़ JSON लाइब्रेरी है (विशेष रूप से जब स्ट्रीम पढ़ने/लिखने) बड़े दस्तावेज।

+0

लिंक के अनुसार, परियोजना को छोड़ दिया गया है। – null

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