後で処理するために、大量のシミュレートされた時系列データを保存する方法を探しています。データ ポイントは、文字列からプリミティブ データ型のタプル (主に浮動小数点) へのマッピングによって記述できます。各データ ポイントには時系列があり、各時系列には ID があります。このデータをディスクに読み書きする効率的な方法を探しています。シミュレーションは大体こんな感じ
Sample sample = new Sample();
for (int i=0; i<samplesize; i++) {
State s = initialState();
for (int t=0; t<stages; t++) {
Map<String,Double> data = s.getData();
sample.add(i,t,data);
s = s.nextState();
}
}
Sample クラスを実装するために、これまでに次のことをテストしました。
- ネストされたリスト / キーと値のマップ: 非常に簡単ですが、すべてのデータをメモリに保持し、すべてをディスクにシリアル化するのはうまくスケーリングしません。
- MapDB: (a) 時系列 ID をキーとして、時系列を値として使用する、(b) 時系列 ID のフラット インデックスと時間インデックスをキーとして、データ ポイントを値として使用する、2 つのバリアントをテストしました。(b)の性能が少し気になりますが、(a)はそこそこうまくいきました。
また、単純にすべてを CSV に書き込むことも検討しました。これの利点は、事実上誰でも後でデータをインポートできることです。欠点は、任意の ID を持つ特定の時系列またはレコードを検索するには、レコードが見つかるまでファイルを 1 行ずつ読み取る必要があることです。