首页 > 解决方案 > 在创建非常大的列表块时内存不足

问题描述

我需要获取公共 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 调用。

我的主要问题是,这段代码给我返回了一个内存不足的异常,这是不稳定的。

我怎样才能做到这样的过程,同时尽可能高效并避免这些内存问题?

标签: javalistjava-8java-streamout-of-memory

解决方案


列出 70,000,000 个高度可预测的值有什么意义?如果您将分块列表传递给 API,则只需根据需要构建那些较小的列表。您只需要跟踪接下来要使用的号码。


推荐阅读