Jerkson Json парсер для скала.

Я использовал Jerkson для Scala, чтобы сериализовать мой список объектов в файл JSON. Я могу разложить объект на объект формата JSON и записать в файл. Теперь, когда я хочу прочитать это в моей программе для дальнейшей обработки, я получаю эту ошибку. К вашему сведению, мой размер файла составляет 500 МБ и в будущем может возрасти до 1 ГБ.

Я видел несколько форумов, которые попросили увеличить XX: MaxPermSize = 256M. Я не уверен, решит ли это мою проблему, даже если пока не решает, какова гарантия того, что это может не проявиться позже, когда размер моего файла JSON вырастет до 1 ГБ. Есть ли лучшая альтернатива? Спасибо!

Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
    at java.lang.String.intern(Native Method)
    at org.codehaus.jackson.util.InternCache.intern(InternCache.java:41)
    at org.codehaus.jackson.sym.CharsToNameCanonicalizer.findSymbol(CharsToNameCanonicalizer.java:506)
    at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:997)
    at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:418)
    at com.codahale.jerkson.deser.ImmutableMapDeserializer.deserialize(ImmutableMapDeserializer.scala:32)
    at com.codahale.jerkson.deser.ImmutableMapDeserializer.deserialize(ImmutableMapDeserializer.scala:11)
    at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
    at com.codahale.jerkson.Parser$class.parse(Parser.scala:83)
    at com.codahale.jerkson.Json$.parse(Json.scala:6)
    at com.codahale.jerkson.Parser$class.parse(Parser.scala:14)
    at com.codahale.jerkson.Json$.parse(Json.scala:6)

2 ответа

Решение

Из трассировки стека мы видим, что Джексон интернирует строки, которые анализируются как имена полей в вашем документе. Когда String интернирован, он помещается в PermGen, который является частью кучи, из которой у вас заканчивается. Я считаю, что это потому, что у вашего документа много, много разных имен полей - возможно, с помощью какой-то схемы именования? Как бы то ни было, увеличение MaxPermSize может помочь некоторым или, по крайней мере, отсрочить проблему, но не решит ее полностью.

С другой стороны, отключение интернирования строк в Джексоне должно полностью решить эту проблему. В FAQ по Джексону есть больше информации о том, какие параметры конфигурации нужно настроить: http://wiki.fasterxml.com/JacksonFAQ

Добавление памяти будет только лечить симптом, а не лечить болезнь. Я бы сказал, что эта проблема памяти Джерксона - скрытое благословение, которое раскрывает фундаментальный недостаток дизайна.

Что касается того, как вы лечите болезнь, я не могу сказать наверняка, так как я ничего не знаю о вашем применении или случаях использования. Я уверен, что вам не нужно 1 ГБ информации за раз. Рассмотрите возможность потокового чтения вашего файла JSON в базу данных или кэш, а затем извлекайте только то, что вам нужно для решения конкретной проблемы.

Неопределенно, я знаю, но я не могу предложить конкретику без более подробной информации. Суть в том, потоковое и постоянное.

Другие вопросы по тегам