java - 性能方面功能的优化实现

标签 java optimization

我有一个项目列表和一个存储有关产品及其项目数据的信息的 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 8 parallelStream(),您也许可以获得可接受的结果,而无需自己处理同步的麻烦。

关于java - 性能方面功能的优化实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600011/

相关文章:

performance - 我可以做些什么来提高 Lua 程序的性能?

python - 最快的 Python 等效于整数数组的开关

java - 如何显示层次结构 (Java)

java - 执行action.run()方法时延迟

java - 如何使用带反射的动态加载界面?

c++ - pqxx 返回刚刚插入的行的 id

c# - 主线程上的网络请求导致帧率延迟峰值

java - 公共(public)链部署

java - 使用 MARF 进行说话人识别

algorithm - 查询n次时如何改进Dijkstra算法?