1

我正在寻找一种方法来存储大量模拟时间序列数据以供以后处理。数据点可以通过从 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 的记录需要逐行读取文件,直到找到记录。

4

2 回答 2

0

因为您使用的是外部存储器,您可能需要通读Henrik Jonsson 的论文中关于 B-trees 的章节- B-trees本身是一种非常流行的在外部存储器中索引数据的方法,您应该能够找到 Java 中的实现, Jonnson 讨论了如何调整它们以存储时间序列数据。

于 2013-06-30T14:04:37.927 回答
0

一个现成的(开源)库是分层数据格式(HDF),可用于存储时间序列数据。该软件的Java 兼容版本也存在。

在内部,它使用 B 树来存储数据并提供许多其他功能来提高性能(压缩、缓存等)。

于 2017-01-31T11:41:38.963 回答