存储大量模拟时间序列数据

时间:2013-06-30 13:43:11

标签: java database map simulation time-series

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

2 个答案:

答案 0 :(得分:0)

因为你正在使用外部存储器,你可能想要阅读Henrik Jonsson's thesis中的B树章节 - B-trees本身是一种非常流行的方法来索引外部存储器中的数据,你应该能够在Java中找到实现,Jonnson讨论了如何使它们适应存储时间序列数据。

答案 1 :(得分:0)

一个随时可用的(开源)库是Hierarchical Data Format(HDF),可用于存储时间序列数据。该Java-compatible version软件也存在。

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