【问题标题】:Which data structure is sensible for time series data in Java?哪种数据结构对 Java 中的时间序列数据有效?
【发布时间】:2013-06-07 20:44:11
【问题描述】:

我是 Java 新手,所以我不确定在这里选择哪种数据结构更好。我会将加速度计、陀螺仪和磁力计数据(9 个值)存储在一个列表中,以便稍后用于平滑、显示和一些信号处理。

我的想法是创建一个对象MyObject,它有十个成员:时间戳和九个方向/运动值,它们都是浮动的。然后我会将数据存储在ArrayList<MyObject> 中。这是个好主意还是我忽略了什么?

该列表最多可包含 100k 个值。

【问题讨论】:

  • 有并发访问的可能吗?
  • @fge 不,一切都将在一个线程中运行。
  • 那么 ArrayList 就可以了。但是 100k 的值是相当大的,你是在处理之前将它们写入持久存储还是在运行时处理它们?
  • @fge 它将被存储在一个文件中。处理不会实时进行。
  • 那么你应该对你的想法没问题;)

标签: java data-structures


【解决方案1】:

首先使用 TreeMap 来提高查找性能。

TreeMap

注意(在文档中):

此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。

【讨论】:

  • @fge 对于 n = 100k,n 与 log(n),log(n) = 5 和 n = 100 000。如果我正在搜索特定项目并且它恰好是最后一个项目我必须搜索 100 000 个项目才能匹配最后一个项目。也许属性的 Hashmap 可以在 ArrayList 中创建索引,以提供 1 步数组索引访问。如果您不知道要查找的项目的索引,不太确定排序的数组列表如何提供更快的访问?
  • 读取 cmets:他不必访问他程序中的数据,只需存储它,稍后再进行处理。因此,他需要一个“仅快速插入”的数据结构。 TreeMap 对此太过分了。
  • 对 ArrayList 的写入是 O(1)。而且,由于数据是排序的,所以搜索是 O(log(n))。
  • 当您必须先对数据进行排序时,如何插入 ArrayList 为 O(1)?
  • @Excalibur2000 数据是按顺序获取的,因为我在记录传感器数据。
【解决方案2】:

创建自己的课程是正确的方法。现在用于存储该类的对象...

如果您需要在所有对象上直接查找(例如,“给我第 5 个对象”),请使用 ArrayList。但如果您只是按顺序遍历所有对象,则应考虑使用linked list

ArrayList 类使用一个原始数组,它将根据需要增长以容纳您添加到其中的元素。当它增长其内部结构时,它需要分配一个新数组并复制所有原始值。这可能代价高昂(尤其是 100K 元素!)。您可以给它一个初始大小,以便在它需要增长之前给它更多时间;但是如果你最终不需要那么多空间,ArrayList 的内部数组可能会浪费大量内存。

向链表添加元素几乎不需要任何成本,因为不需要“增长”;它只是将另一个节点添加到列表中。但是您不能通过索引查找项目。您必须从第一个元素开始,然后在列表中循环到您想要的元素。

【讨论】:

    【解决方案3】:

    您可能需要考虑使用文件输出流直接输出数据,而不是将其存储在某种数据结构中:

    output = new BufferedWriter(new FileWriter("output.csv"));
    
    while(dataSource.stillHasData())
        output.println(dataSource.getData().toString());
    
    output.close();
    

    使用BufferedWriter 可确保程序在获取下一个数据之前不必等待磁盘写入发生,因此这对于收集实时数据是可以接受的(通常)。

    然后你应该在你的数据类中做这样的事情:

    public String toString(){
        StringBuilder buf = new StringBuilder();
    
        buf.append(timeStamp); str.append(',');
        // ...
        // append all the other data
    
        return buf.toString();
    }
    

    这样做的好处是,您可以将其导入到诸如 excel 之类的程序中,或者实际上几乎是您用来处理数据的任何程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      相关资源
      最近更新 更多