json - 使用 net.liftweb.json 或 scala.util.parsing.json 解析大型 (30MB) JSON 文件会产生 OutOfMemoryException。有什么建议吗?

标签 json scala lift

我有一个包含大量测试数据的 JSON 文件,我想解析并推送我正在测试的算法。它大约有 30MB 大小,包含大约 60,000 个元素的列表。我最初在 scala.util.parsing.json 中尝试了简单的解析器,如下所示:

import scala.util.parsing.json.JSON
val data = JSON.parseFull(Source.fromFile(path) mkString)

其中 path 只是一个包含大 JSON 文件路径的字符串。大约持续了 45 分钟,然后抛出了这个:
java.lang.OutOfMemoryError: GC overhead limit exceeded

然后有人向我指出没有人使用这个库,我应该使用 Lift 的 JSON 解析器。所以我在我的 Scala REPL 中尝试了这个:
scala> import scala.io.Source
import scala.io.Source

scala> val s = Source.fromFile("path/to/big.json")
s: scala.io.BufferedSource = non-empty iterator

scala> val data = parse(s mkString)
java.lang.OutOfMemoryError: GC overhead limit exceeded

这次只用了3分钟左右,但是同样的错误。

所以,显然我可以将文件分解成更小的文件,遍历 JSON 文件的目录并将我的数据一块一块地合并在一起,但如果可能的话,我宁愿避免它。有人有什么建议吗?

有关更多信息——过去几周我一直在 Clojure 中使用相同的数据集(用于使用 Incanter 进行可视化),没有出现任何问题。以下工作非常好:
user=> (use 'clojure.data.json)
nil
user=> (use 'clojure.java.io)
nil

user=> (time (def data (read-json (reader "path/to/big.json"))))
"Elapsed time: 19401.629685 msecs"
#'user/data

最佳答案

这些消息表明应用程序正在花费 more than 98% of its time收集垃圾。

我怀疑 Scala 生成了很多短期对象,这就是导致过多 GC 的原因。您可以通过添加 -verbosegc 来验证 GC 性能。命令行切换到 java .

default max heap size在 Java 1.5+ 服务器 VM 上为 1 GB(或已安装内存的 1/4,以较小者为准),这应该足以满足您的目的,但您可能希望增加新一代以查看是否可以提高您的性能。在 Oracle VM 上,这是通过 -Xmn 完成的。选项。尝试设置以下环境变量:

$JAVA_OPTS=-server -Xmx1024m -Xms1024m -Xmn2m -verbosegc -XX:+PrintGCDetails

并重新运行您的应用程序。

您还应该查看 this tuning guide详情。

关于json - 使用 net.liftweb.json 或 scala.util.parsing.json 解析大型 (30MB) JSON 文件会产生 OutOfMemoryException。有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898353/

相关文章:

java - 在自定义注解中实现@RequestBody的功能

scala - 使用反射和解释器动态解析字符串并在 Scala 中返回一个函数

scala - 无法读取 Parquet 支持的区分大小写的 Glue 表

json - 如何在 Scala 中将 Map 序列化为 JSON?

session - 在 Lift Scala 中存储 session 变量

json - AlamofireObjectMapper,嵌套的 JSON 结构在序列化时始终为 nil

json - 使用 if/then 的正则表达式前瞻非捕获

python - 在 Python 2.6 中使用 JSON?

scala - 如何获取 sbt 0.12 中 sbt 项目中定义的测试列表?

scala - 是否有任何支持 OAuth 2.0 的 Scala OAuth 库?