DBからデータを取得するためにJavaプログラムを使用しています。次に、いくつかの数値を計算し、それらを配列に格納し始めます。私が使用しているマシンには 4 ギガの RAM があります。さて、事前にいくつになるか分からないのでArrayList<Double>.
、300 million numbers.
したがって、1 つの double は 8 バイトであるため、この配列が消費するメモリの概算は 2.4 ギガです (おそらく ArrayList のオーバーヘッドのため、それ以上になります)。この後、この配列の中央値を計算したいので、配列org.apache.commons.math3.stat.descriptive.rank.Median
を入力とするライブラリを使用していますdouble[]
。したがって、 を に変換する必要がありArrayList<Double>
ますdouble[]
。
これが提起された多くの質問を見ましたが、それらはすべて、配列全体をループする方法はないと述べています。これで問題ありませんが、両方のオブジェクトをメモリ内に維持するため、メモリ要件は最大 4.8 ギガになります。利用可能な RAM の合計が 4 GB であるため、問題が発生しました。
まず第一に、プログラムがある時点で正しいメモリエラーを与えるという私の疑いはありますか(現在実行中です)?もしそうなら、2倍のメモリを割り当てずに中央値を計算するにはどうすればよいですか? 中央値の計算は O(n) であるため、配列の並べ替えを避けたいと考えています。