【发布时间】:2018-05-05 14:14:44
【问题描述】:
我正在从 API 导入数据,该 API 以 JSONArrays 内的 JSONArrays 格式返回数据,具有 6 个深度级别。 为了尽可能从最低级别检索数据,我目前正在从一个数组循环到另一个数组以最终创建一个 JSON 对象。类似的东西:
JSONObject jsonObject = new JSONObject(result);
JSONObject resultSet = jsonObject.getJSONObject("result_set");
if (resultSet.has("field1")) {
JSONArray field1ResultSet = resultSet.getJSONArray("field1");
for (int i = 0; i < field1ResultSet.length(); i++) {
JSONObject field1Object = countriesResultSet.getJSONObject(i);
String field1 = field1Object.getString("field1Object");
JSONArray field2Array = field1Object.getJSONArray("field2");
for (int t = 0; t < field2Array.length(); t++) {
JSONObject field2Object = field2Array.getJSONObject(t);
String field2 = field2Object.getString("name");
JSONArray field3Array = field2Object.getJSONArray("field3");
for (int z = 0; z < field3Array.length(); z++) {
JSONObject field3Object = field3Array.getJSONObject(z);
String field3 = field3Object.getString("name");
String field3_2 = field3Object.getString("token");
JSONArray field4Array = field3Object.getJSONArray("field4");
for (int m = 0; m < field4Array.length(); m++) {
JSONObject field4Object = field4Array.getJSONObject(m);
String field4 = field4Object.getString("name");
JSONArray field5Array = field4Object.getJSONArray("field5");
for (int n = 0; n < field5Array.length(); n++) {
JSONObject field5Object = field5Array.getJSONObject(n);
String field5 = field5Object.getString("name");
JSONArray field6Array = field5Object.getJSONArray("field6");
for (int g = 0; g < field6Array.length(); g++) {
JSONObject field6Object = field6Array.getJSONObject(g);
String field6 = field6Object.getString("name");
JSONArray kpiValues = field6Object.getJSONArray("kpi_values");
JSONObject finalObject = new JSONObject();
finalObject.put("date", DATE);
finalObject.put("field1", field1);
finalObject.put("field2", field2);
finalObject.put("field3", field3);
finalObject.put("field3_2", field3_2);
finalObject.put("field4", field4);
finalObject.put("field5", field5);
finalObject.put("field6", field6);
然后我将这个 JSONObject 存储在 JSONArray 中,以便稍后导出,这几乎就是这个过程。 这里的问题是,正在检索的信息太大,以至于导致我在整个过程中途出现“线程“主”java.lang.OutOfMemoryError:Java 堆空间中的异常”。 不幸的是,API 没有任何逻辑来按页面或类似的方式发送数据,所以我非常有限。 有人对我应该如何处理这个问题有任何建议吗?
感谢您的宝贵时间
【问题讨论】:
-
向我们展示您正在阅读的单个 JSON 对象的示例,以便我们更好地理解您使用 6 个 for 循环的原因...
-
这个问题是由“一次占用太多内存”引起的。由于源 JSON 字符串完全在内存中并被解析(这意味着不需要提供 JSON 数据的 API 来支持流/分页工作!),增加的内存使用和程序终止是与输出生成有关。输出可以流式传输(例如立即写入)吗?使用“PULL”解析器可以进一步减少内存。如果这些都不是选项,是否可以为进程分配更多内存?
标签: java arrays json performance heap-memory