java - 在创建非常大的列表块时内存不足
问题描述
我需要获取公共 API 返回的所有成员的列表。
问题是我不知道任何 ID,但我知道第一个 ID 在 500000000 之后开始,最后一个 ID 在 570000000 左右。经过检查,我知道这些 ID 是生成的时间戳,但我没有任何其他信息。
所以我唯一的解决办法就是自己去拿。
我写了这个:
private List<List<Long>> getFinalList() {
return chunkArrayList(getInitList(), 100);
}
private List<Long> getInitList() {
List<Long> idList = new ArrayList<>();
for (long i = 500000000L; i < 570000000L; i++) {
idList.add(i);
}
return idList;
}
private List<List<Long>> chunkArrayList(List<Long> listToChunk, int chunkSize) {
AtomicInteger counter = new AtomicInteger();
return new ArrayList<>(listToChunk.stream().collect(Collectors.groupingBy(l -> counter.getAndIncrement() / chunkSize)).values());
}
注意:我必须将我的列表分成更小的列表,以便将它们分成多个 API 调用。
我的主要问题是,这段代码给我返回了一个内存不足的异常,这是不稳定的。
我怎样才能做到这样的过程,同时尽可能高效并避免这些内存问题?
解决方案
列出 70,000,000 个高度可预测的值有什么意义?如果您将分块列表传递给 API,则只需根据需要构建那些较小的列表。您只需要跟踪接下来要使用的号码。
推荐阅读
- java - 当我尝试将类的内容添加到数组时程序崩溃
- python - Python类型:有没有办法为“元素”构造类型?
- python - 运行非阻塞协程的简单方法是什么?
- python - python交叉编译中ac_cv_file标志的含义是什么
- java - 为什么 RecyclerView 在 ToolBar 上膨胀?
- terraform - 引用在不同文件夹中创建的 Terraform 资源
- networking - TCP 服务器发送 [ACK] 后跟 [PSH,ACK]
- allure - 如何使用 jbhave 添加自定义魅力报告
- mysql - 查询返回重复值
- flutter - 如果布尔列表中的所有值都为真,则将变量设置为真的最佳方法