【发布时间】:2013-11-22 05:02:18
【问题描述】:
我正在使用 java 程序从数据库中获取一些数据。然后我计算一些数字并开始将它们存储在一个数组中。我正在使用的机器有 4 GB 的 RAM。现在,我不知道会有多少个数字,所以我使用ArrayList<Double>. 但我知道大概会有300 million numbers.
因此,由于一个 double 是 8 字节,因此该数组将消耗的内存粗略估计为 2.4 gig(可能更多,因为 ArrayList 的开销)。在此之后,我想计算这个数组的中位数,并使用org.apache.commons.math3.stat.descriptive.rank.Median 库,它将double[] 数组作为输入。 所以,我需要将ArrayList<Double> 转换为double[]。
我确实看到了很多提出这个问题的问题,他们都提到没有办法绕过整个数组。现在这很好,但由于它们还在内存中维护这两个对象,这使我的内存需求达到了 4.8 gigs。现在我们遇到了一个问题,因为我们可用的总 RAM 有 4 个演出。
首先,我是否怀疑该程序会在某些时候给我一个正确的内存错误(它当前正在运行)?如果是这样,我如何计算中位数而不必分配双倍的内存?我想避免对数组进行排序,因为计算中位数是 O(n)。
【问题讨论】:
-
写一个代码来显示你在做什么。
-
如果数据在数据库中,为什么不使用数据库进行计算?您说的是从查询中检索 3 亿行吗?你用的是什么数据库?