gpt4 book ai didi

Java8 Stream批处理以避免OutOfMemory

转载 作者:行者123 更新时间:2023-12-03 03:44:42 28 4
gpt4 key购买 nike

我有这样的事情:

    List<Data> dataList = stepts.stream()
.flatMap(step -> step.getPartialDataList().stream())
.collect(Collectors.toList());

因此,我将每一步的多个列表合并到 dataList 中。

我的问题是 dataList 可能会遇到 OutOfMemoryError。关于如何批量处理 dataList 并将批处理保存到数据库中有什么建议吗?

我的原始想法是:

    for (Step step : steps) {
List<Data> partialDataList = step.getPartialDataList();

if (dataList.size() + partialDataList.size() <= MAXIMUM_SIZE) {
dataList.addAll(partialDataList);
} else {
saveIntoDb(dataList);
dataList = new ArrayList<>();
}
}

PS:我知道有this帖子,但不同的是我可能无法将整个数据存储在内存中。

LE:getPartialDataList方法更像是createPartialDataList()

最佳答案

如果您关心的是OutOfMemoryError在保存到数据库之前,您可能不应该创建其他中间数据结构,例如列表或流。

Step.getPartialDataList()已返回List<Data>数据已经在内存中了,除非你有自己的List执行。您只需要使用 JDBC batch insert :

PreparedStatement ps = c.prepareStatement("INSERT INTO data VALUES (?, ?, ...)");
for (Step step : steps) {
for (Data data : step.getPartialDataList()) {
ps.setString(1, ...);
ps.setString(2, ...);
...
ps.addBatch();
}
}
ps.executeBatch();

没有必要使用 dataList 过早地分成较小的批处理。 。在进行过早优化之前,首先查看您的数据库和 JDBC 驱动程序支持什么。

请注意,对于大多数数据库来说,插入大量数据的正确方法是使用外部实用程序,而不是 JDBC,例如PostgreSQL has COPY .

关于Java8 Stream批处理以避免OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58938884/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com