2017-07-06 9 views
0

私の問題:私はJFreeChartのデータベースから膨大なデータをダウンロードしています。私は、プリミティブテーブルを使用せずにデータメモリの使用量を最適化したい。メモリ割り当てプリミティブストリームとプリミティブ型テーブル

コレクションを操作するには、オブジェクトの使用が必要です。 の代わりにIntStreamのようなプリミティブストリームを使用してメモリ使用量を最適化できるかどうか疑問に思っています。

信頼できるベンチマークの作成方法はわかりません。

+2

良いコードをまず作成し、必要に応じて後で最適化します。事前最適化は間違いです。 – lucasvw

+0

おそらくオブジェクトのサイズを測定する*信頼できる方法ですが、http://openjdk.java.net/projects/code-tools/jol/に慣れるまでに時間がかかります – Eugene

+0

'IntStream'は「フライウェイトオブジェクト "です。ある意味では、Javaストリーム、プリミティブ、またはそれ以外のものは、それだけで「閲覧」することでアクセスできる単一のデータを「持つ」ことができます。データベースをjdbc形式で使用することを考慮すると、ResultSetはソートのイテレータとして見ることもできますが、実際にストリームを構築することができますが、これは多くの場合の1つの解決策に過ぎません。 Javaですべての処理を行うサイクルを無駄にすることなく、すべてのチャートデータを作成し、データベースで直接トリミングすることもできます。 –

答えて

1

開始点がLinkedList<Integer>の場合、ArrayList<Integer>に置き換えるだけで、When to use LinkedList over ArrayList?で説明されているように、メモリ消費が大幅に削減されます。ボックス化された整数は小さなオブジェクトであり、同じ値をボクシングするときに再利用されるものもありますので、this answerのグラフに意味があります。

簡略化したい場合は、int[]を使用してください。インクリメンタルに書き込むことができるものが必要な場合は、Stream APIが本当にオプションです。 IntStream.builder()を使用してIntStream.Builderを取得し、新しいintの値を繰り返し追加できます。すべての値が含まれている場合は、int[]配列にすべての値が含まれるようにbuild().toArray()を呼び出すか、build()によって返されたIntStreamのフィルタリングおよび集計演算を直接実行できます(集約演算を縮小として表すことができます)。