我们正在进行一个涉及流数据实时和历史分析的f#项目。数据包含在c#对象中(见下文),并作为标准的.net事件的一部分发送。实时情况下,我们通常接收的事件数量可能会大不相同,从小于每秒1个到每秒每个仪器的800个以上,并且可能会非常突发。一般而言,一个典型的日子可能会积累每个仪器5百万行/元素。
C#事件数据结构的通用版本如下:
C#事件数据结构的通用版本如下:
public enum MyType { type0 = 0, type1 = 1}
public class dataObj
{
public int myInt= 0;
public double myDouble;
public string myString;
public DateTime myDataTime;
public MyType type;
public object myObj = null;
}
我们计划以两种方式在F#中使用此数据结构:
- 使用监督和无监督机器学习(CRFs、聚类模型等)进行历史分析
- 使用上述模型对数据流进行实时分类
数据结构需要能够随着我们添加更多事件而增长。这就排除了array<t>
,因为它不允许调整大小,尽管它可用于历史分析。该数据结构还需要能够快速访问最近的数据,并且最好能够跳转到x个点的数据。这排除了Lists<T>
,因为它具有线性查找时间,并且没有对元素的随机访问,只有“仅向前”遍历。
根据此帖子,Set<T>
可能是一个不错的选择...
编辑:Yin Zhu的回应给我带来了额外的清晰度,准确地说明了我的要求。我已经编辑了剩余的帖子以反映这一点。此外,先前版本的问题在历史分析要求的介绍中变得混乱。我省略了它们。
以下是实时过程的步骤说明:
- 接收到实时事件
- 将该事件放入数据结构中。我们正在确定的是这个数据结构。它应该是一个
Set<T>
还是其他一些结构? - 从元素的子集中提取或以某种方式进行迭代,以生成特征。这可以是数据结构的最后n行/元素(即最后1000个事件或10000个事件),也可以是最后x秒/分钟内的所有元素(即过去10分钟内的所有事件)。理想情况下,我们希望使用一种允许我们高效执行此操作的结构。特别是一种允许随机访问第n个元素而无需遍历所有其他元素的数据结构是有价值的。
- 生成模型的特征并将其发送到模型进行评估。
- 我们可以修剪旧数据的数据结构以提高性能。
因此,问题是用于存储我们将用于生成特征的实时流事件的最佳数据结构是什么。