相关疑难解决方法(0)

F#高频实时流数据的不可变数据结构

我们正处于f#项目的开端,该项目涉及流数据的实时和历史分析.数据包含在ac#对象中(见下文),并作为标准.net事件的一部分发送.实时地,我们通常接收的事件的数量可以从每个仪器每秒大约800个事件的不到1 /秒到更高的变化很大,因此可以是非常突发的.典型的一天可能会累积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;

}
Run Code Online (Sandbox Code Playgroud)

我们计划以两种方式在f#中使用这个数据结构:

  1. 使用有监督和无监督机器学习(CRF,聚类模型等)的历史分析
  2. 使用上述模型对数据流进行实时分类

随着我们添加更多事件,数据结构需要能够增长.这排除了array<t>因为它不允许调整大小,尽管它可以用于历史分析.数据结构还需要能够快速访问最近的数据,理想情况下需要能够跳回到数据x点.这排除了Lists<T>因为线性查找时间,并且因为没有随机访问元素,只是"仅向前"遍历.

根据这篇文章,Set<T>可能是个不错的选择......

>"... Vanilla Set <'a>做的工作不够充分.我更喜欢在'List'上设置'Set',所以你总是可以O(lg n)访问最大和最小的项目,允许你通过插入日期/时间订购您的设置,以便有效地访问最新和最旧的项目..."

编辑:尹祝的回应让我更清楚地知道我在问什么.我已经编辑了帖子的其余部分以反映这一点.此外,通过引入历史分析的要求,这个问题的先前版本变得混乱.我省略了它们.

以下是实时流程步骤的细分:

  1. 收到实时事件
  2. 此事件放在数据结构中.这是我们试图确定的数据结构.它应该是一个Set<T>还是其他结构?
  3. 为了产生特征,要么提取元素或以某种方式迭代元素的子集.这将是数据结构的最后n行/元素(即,最后1000个事件或10,000个事件)或最后x秒/分钟中的所有元素(即最后10分钟内的所有事件).理想情况下,我们需要一种允许我们有效地执行此操作的结构.特别是,允许​​随机访问第n个元素而不迭代所有其他元素的数据结构是有价值的.
  4. 生成模型的特征并将其发送到模型以进行评估.
  5. 我们可能会修剪旧数据的数据结构以提高性能.

所以问题是什么是用于存储我们将用于生成功能的实时流事件的最佳数据结构.

f# stream data-structures f#-3.0 f#-data

11
推荐指数
4
解决办法
2054
查看次数

标签 统计

data-structures ×1

f# ×1

f#-3.0 ×1

f#-data ×1

stream ×1