我有一个项目列表和一个存储有关产品及其项目数据的信息的 map 。数据库中有大约 15 万个项目和大约 20 万个产品(每个产品大约有 1000 到 2000 个映射到它的项目)。
我需要一个函数来计算每个项目出现的产品数量。这是我已经实现的函数:
public Map<Integer, Integer> getProductsNumberForItem(List<Item> itemsList,
Map<Integer, Map<Item, Integer>> itemsAmount) {
Map<Integer, Integer> result = new HashMap<>();
for (Item i : itemsList) {
int count = 0;
for (Map<Item, Integer> entry : itemsAmount.values()) {
if (entry.containsKey(i)) {
count++;
}
}
result.put(i.getID(), count);
}
return result;
}
它在我的测试数据库上运行良好,该数据库的数据量很小,但是当我在真实数据上运行它时,它花费了太多时间(例如:它已经运行了一个小时,但仍未完成)。从逻辑的角度来看,很明显,我基本上执行了太多操作,但不确定如何优化。
如有任何建议,我们将不胜感激。
最佳答案
你有两种方法:
最高效:在数据库中执行的查询中进行计算。
使用count()
聚合和group by
子句,您应该会得到更好的结果,因为整个处理将由专门设计/优化的 DBMS 执行。效率较低,但您可以尝试一下:像现在一样检索数据并使用多线程。
使用 Java 8parallelStream()
,您也许可以获得可接受的结果,而无需自己处理同步的麻烦。
关于java - 性能方面功能的优化实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600011/