Анализ большого (30 МБ) файла JSON с помощью net.liftweb.json или scala.util .parsing.json дает OutOfMemoryException. Есть какие-нибудь рекомендации?

У меня есть файл JSON, содержащий довольно много тестовых данных, которые я хочу проанализировать и пропустить через проверяемый мной алгоритм. Его размер составляет около 30 МБ, а список содержит около 60 000 элементов. Сначала я попробовал простой синтаксический анализатор в scala.util.parsing.json, например:

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

Где путь - это просто строка, содержащая путь к большому файлу 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
13
задан jaley 17 January 2012 в 16:42
поделиться