【问题标题】:Java: 10gb database read into array list means 10gb worth of memory?Java:10gb 数据库读入数组列表意味着 10gb 的内存?
【发布时间】:2013-10-26 04:27:26
【问题描述】:

如果标题不清楚,请见谅。

如果我将 10gb 的数据从数据库读取到列表中,这是否意味着应用程序现在正在消耗 10gb 的内存?或者是否涉及某种类型的优化/压缩?

【问题讨论】:

    标签: java database memory


    【解决方案1】:

    事实上,如果你一次将 10GB 的数据全部读入任何程序,由于对象的开销,将导致使用超过 10GB 的内存。根据经验,这个放大系数约为 2.4 ~ 3 倍(即 10GB = 24 ~ 30GB 的内存消耗)。

    处理大量内存时,处理一个小块并将其写入您的输出。这样,您不会一次加载所有 10GB,从而节省内存。

    如果您的 10GB 数据库需要响应提交给它的查询。仅在提交查询时获取数据并使用缓存来优化数据库。施加最大结果集大小限制,以防止您的程序遇到 OutOfMemoryError。

    【讨论】:

    • 我明白了 - 谢谢。我曾希望相反的情况是正确的。我需要整个数据库来执行我的计算。因此,一次仅对块的输出是无意义的。我是否需要更改我的计算才能逐步执行它们还是有更好的方法?
    • @Max 有没有办法存储部分计算?例如,对数据库中的特定字段求和只需要您一次加载一个条目(行),同时维护一个求和变量。当然,计算的复杂性可能远远超出简单的求和,但我相信总会有一种方法允许在任何给定时间只读取数据库的一个子集。
    • 或许你可以看看像redis这样的内存缓存。
    • 感谢 CPU 终结者。我认为短期的答案是建立它,看看我们如何去。选择性查询可能是一个长期的解决方案。
    猜你喜欢
    • 2013-10-29
    • 2011-05-27
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-01-22
    • 2013-10-18
    • 2011-06-27
    相关资源
    最近更新 更多