Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 为什么Scala代码很慢?_Json_Performance_Scala - Fatal编程技术网

Json 为什么Scala代码很慢?

Json 为什么Scala代码很慢?,json,performance,scala,Json,Performance,Scala,我正在运行以下Scala代码: import scala.util.parsing.json._ import scala.io._ object Main { def jsonStringMap(str: String) = JSON.parseFull(str) match { case Some(m: Map[_,_]) => m collect {

我正在运行以下Scala代码:

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
                }
        }
}
在我的机器上,从开始读取文件大约需要3分钟。我编写的等效Haskell和Ruby程序不到4秒。我做错了什么

我在没有映射的情况下尝试了相同的代码(jsonStringMap),它非常快,那么JSON解析器真的很慢吗

默认的JSON解析器看起来确实很慢,但是我试过了,虽然它可以缩短到35秒,但仍然比Ruby慢得多


我现在用的是速度更快的!现在,我的程序在我的数据上只运行了6秒,比Ruby慢了3秒,Ruby可能只是JVM的启动。

快速查看scala用户档案似乎表明,没有人在scala标准库中认真使用JSON解析器

似乎解析器最终出现在标准库中的时候scala不那么引人注目,也没有今天的期望值。

使用,我几乎可以立即解析这两个文件:

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进行解析比使用大量单独的行更有用。Jerkson使用Jackson,这是JVM上速度最快的JSON库(尤其是在流读/写大型文档时)。

也许更适合codereview.stackexchange.com另一方面,您似乎在独立解析每一行。你试过为整个JSON文档调用一次解析器吗?我很确定答案是,“没有人会费心编写一个快速的JSON解析器。”解析器组合器(JSON解析器就是其中之一)是为了易于创建,而不是性能。如果你想提高速度,最好使用Java JSON库。lift JSON必须很快,正如这个问题的答案中所提到的,如果我们能看到Ruby/Haskell程序,回答起来会更容易。根据链接,这个项目已经被放弃了。