我正在寻找一种方法来存储大量模拟时间序列数据以供以后处理。数据点可以通过从 String 到原始数据类型(主要是浮点)的元组的映射来描述。每个数据点都有一个时间序列,每个时间序列都有一个 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 和时间索引的平面索引作为键,数据点作为值。我有点担心 (b) 的性能,但 (a) 工作得相当好。
我还考虑过简单地将所有内容写入 CSV。这样做的好处是几乎任何人都可以稍后导入数据。缺点是搜索特定时间序列或具有任意 id 的记录需要逐行读取文件,直到找到记录。