我们正处于一个涉及流数据的实时和历史分析的 f# 项目的开始阶段。数据包含在 ac# 对象中(见下文),并作为标准 .net 事件的一部分发送。在实时情况下,我们通常接收到的事件数量变化很大,从不到 1/秒到每台仪器每秒大约 800 个事件,因此可能非常突发。典型的一天可能每个仪器累积 500 万行/元素
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# 中使用这个数据结构:
- 使用有监督和无监督机器学习(CRF、聚类模型等)的历史分析
- 使用上述模型对数据流进行实时分类
随着我们添加更多事件,数据结构需要能够增长。这排除了array<t>
因为它不允许调整大小,尽管它可以用于历史分析。数据结构还需要能够快速访问最近的数据,理想情况下需要能够跳转到数据 x 点回来。这排除了Lists<T>
因为线性查找时间并且因为没有随机访问元素,只是“仅向前”遍历。
根据这篇文章,Set<T>
可能是一个不错的选择...
编辑:殷朱的回答让我更清楚地知道我在问什么。我已经编辑了帖子的其余部分以反映这一点。此外,该问题的先前版本因引入历史分析要求而变得混乱。我省略了它们。
以下是实时过程步骤的细分:
- 收到实时事件
- 该事件被放置在数据结构中。这是我们试图确定的数据结构。它应该是 a
Set<T>
还是其他结构? - 为了特征生成的目的,提取或以某种方式迭代元素的子集。这可能是数据结构的最后 n 行/元素(即最后 1000 个事件或 10,000 个事件)或最后 x 秒/分钟内的所有元素(即最后 10 分钟内的所有事件)。理想情况下,我们需要一个能够让我们有效地做到这一点的结构。特别是,允许随机访问第 n 个元素而无需遍历所有其他元素的数据结构是有价值的。
- 生成模型的特征并将其发送到模型进行评估。
- 我们可能会修剪旧数据的数据结构以提高性能。
所以问题是用于存储我们将用于生成特征的实时流事件的最佳数据结构是什么。