小编jal*_*ley的帖子

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

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

import scala.util.parsing.json.JSON
val data = JSON.parseFull(Source.fromFile(path) mkString)
Run Code Online (Sandbox Code Playgroud)

其中path只是一个包含大JSON文件路径的字符串.那拉了大约45分钟,然后扔了这个:

java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)

然后有人向我指出没有人使用这个库,我应该使用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
Run Code Online (Sandbox Code Playgroud)

这次只花了大约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
Run Code Online (Sandbox Code Playgroud)

json scala lift

13
推荐指数
1
解决办法
3771
查看次数

标签 统计

json ×1

lift ×1

scala ×1