Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析巨型json响应_Java_Json_Apache Commons Httpclient - Fatal编程技术网

Java 解析巨型json响应

Java 解析巨型json响应,java,json,apache-commons-httpclient,Java,Json,Apache Commons Httpclient,首先是背景信息: 我正在使用向服务器发出get请求。 服务器响应一个json字符串。 我使用 问题是: 实际上,一切都可以工作,这是针对小响应的(小于2^31字节=一个整数的最大值,该整数限制了和stringbuilder)。另一方面,我有一个巨大的响应(超过几GB),我被卡住了。我尝试使用httpclient的“”,但响应太大,以至于我的系统卡住了。我尝试使用字符串、字符串生成器,甚至将其保存到文件中 问题是: 首先,这是正确的方法吗?如果是,处理这种反应的最佳方式是什么?如果没有,我应该如何

首先是背景信息: 我正在使用向服务器发出get请求。 服务器响应一个json字符串。 我使用

问题是: 实际上,一切都可以工作,这是针对小响应的(小于2^31字节=一个整数的最大值,该整数限制了和stringbuilder)。另一方面,我有一个巨大的响应(超过几GB),我被卡住了。我尝试使用httpclient的“”,但响应太大,以至于我的系统卡住了。我尝试使用字符串、字符串生成器,甚至将其保存到文件中

问题是:
首先,这是正确的方法吗?如果是,处理这种反应的最佳方式是什么?如果没有,我应该如何继续?

如果您有一个响应,它可能是GB的一个因素,那么您应该逐个字符(几乎)将json解析为流,并避免创建任何字符串对象。。。(这一点非常重要,因为如果您不断创建大量垃圾,java stopTheWorld垃圾收集将导致系统释放数秒)

您可以使用创建解析逻辑

您必须实现所有的方法,如onObjectStart、onObjectClose、onObjectKey等。。。一开始很难,但一旦你在测试包中看到PrettyPrinter的实现,你就会有这个想法

一旦正确实现,您就可以处理无限的数据流;)


另外,这是为HFT设计的,所以它的全部内容都是关于性能和无垃圾…

您对数据做了什么?您是将其全部聚合到内存中,还是将其写入某个目标?还有,“卡住”是什么意思?不响应、抛出异常等…?我想更好的问题是,为什么要在web响应中返回GBs的数据?对于我自己的JSON解析器,我使用读取器来解析数据。这可能是一个InputStreamReader,但我不确定这是否会泄漏某种资源。此外,lib还不完整,仍然需要工作(但JSON部分可以工作)。数据正在处理数据的服务器上进行处理。处理完成后,数据应返回到资源较少的服务器。卡住意味着两者都有例外,数据太大了。尝试做其他事情,程序/计算机没有响应。首先,使用streams绝对是正确的方法。我们谈论的是多少GB?你在用什么操作系统?(64位对32位在这里可能会产生很大的不同)。你的JVM启动时使用了多少RAM?很好,我来看看。谢谢你的快速回复!我已经实现了一个解析器,可以将任何Json转换为java映射或数组。。。但你的情况因你所做的不同而有所不同……:)当然,您应该能够使用一些json,并确保在使用后不会留下任何垃圾(干净的引用等)。如果您发现使用这些处理程序很难解析,我可以共享该代码,这样您就可以了解它的外观了。。。它就像一块一块地阅读json,你保持现在的状态,你正在阅读的内容,或者你在下一个回调方法中期望的内容等等。。。