我想知道如何处理大型JSON文件。
我不想将它们存储在内存中,所以我不想执行JsonNode
,因为我认为这会将整个树存储在内存中。
我的另一个想法是使用TokenBuffer
。但是,我想知道这是如何工作的。 TokenBuffer
是否也存储整个文档?有最大限制吗?我知道这是最佳性能,但是如果我这样做:
TokenBuffer buff = jParser.readValueAs(TokenBuffer.class);
似乎它一次读取了整个文档(我不想要)。
最佳答案
TokenBuffer的目的是在内存中存储JSON令牌的可扩展数组。它通过首先创建1个Segment
对象和16个JsonToken
对象,然后根据需要添加新的Segment
对象来实现。
您猜对了整个文档都将被加载到内存中,这是正确的。唯一的区别在于,它不是存储字符数组,而是存储令牌。根据docs的性能优势:
您可以重新处理JSON令牌,而无需从文本表示中重新解析JSON内容。
如果要按所有令牌在缓冲区中追加的顺序进行迭代,速度会更快。TokenBuffer
不是内存中磁盘文件的低级缓冲区。
我只想解析一个文件而不将其全部一次加载到内存中,请跳过TokenBuffer
。只需createJsonParser
或JsonFactory
中的MappingJsonFactory
并使用nextToken
获取令牌。 Example。