通过内存/CPU 效率分析特定时间间隔内的近实时数据所需的想法

2024-01-07

我有一些环境传感器,我想检测温度的突然变化,以及随着时间的推移缓慢的趋势......但是我想根据内存中的参数进行大部分数学计算,参数可能如下所示:(取决于改变)

(注:括号中的项目是在添加数据时实时计算的)

  • 5 分钟(导数、最大值、最小值、平均值)+ 最近 3 小时的 36 个数据点
  • 10 分钟(导数、最大值、最小值、平均值)+ 0 个数据点,计算基于 5 分钟样本
  • 30 分钟(导数、最大值、最小值、平均值)+ 0 个数据点,计算基于 5 分钟样本
  • 每小时(导数、最大值、最小值、平均值)+ 最近 1 天的 24 个数据点
  • 每日(导数、最大值、最小值、平均值)+ 最近一个月的 32 个数据点
  • 每月(导数、最大值、最小值、平均值)+过去一年的 12 个数据点

每个数据点都是一个两字节浮点数。因此每个传感器将消耗最多 124 个浮点,加上 24 个计算变量。我希望支持 .NET 嵌入式设备允许的尽可能多的传感器。

由于我在这个项目中使用嵌入式设备,因此我的内存以及 IO 和 CPU 能力都受到限制。

您将如何在 .NET 中实现这一点?到目前为止,我已经创建了几个结构并将其称为“TrackableFloat" 其中插入一个值会导致旧值从数组中删除并重新计算。

唯一让这一切变得更加 比实际情况复杂的是 对于任何传感器不报告回来 数据,那么该数据点需要是 从所有后续的内容中排除/忽略 实时计算。

当一切都说完并完成后,如果任何值:(导数、最大值、最小值、平均值)达到预定义的设置,则会触发 .NET 事件

我认为有人会认为这是一个有趣的问题,并且很想听听他们将如何实现它。

  1. 您会使用类还是结构体?

  2. 您将如何触发计算? (最有可能发生的事件)

  3. 如何触发警报?

  4. 您将如何分层存储数据?

  5. 有没有一个图书馆已经做了这样的事情? (也许这应该是我的第一个问题)

  6. 您将如何有效地计算导数?

这是我对此的第一次破解,它没有完全符合规范,但非常有效。有兴趣听听您的想法。

enum UnitToTrackEnum
{
    Minute,
    FiveMinute,
    TenMinute,
    FifteenMinute,
    Hour,
    Day,
    Week,
    Month,
    unknown
}
class TrackableFloat
{
    object Gate = new object();

    UnitToTrackEnum trackingMode = UnitToTrackEnum.unknown;
    int ValidFloats = 0;
    float[] FloatsToTrack;

    public TrackableFloat(int HistoryLength, UnitToTrackEnum unitToTrack)
    {
        if (unitToTrack == UnitToTrackEnum.unknown)
            throw new InvalidOperationException("You must not have an unknown measure of time to track.");

        FloatsToTrack = new float[HistoryLength];

        foreach (var i in FloatsToTrack)
        {
            float[i] = float.MaxValue;
        }


        trackingMode = unitToTrack;

        Min = float.MaxValue;
        Max = float.MinValue;
        Sum = 0;
    }
    public void Add(DateTime dt, float value)
    {
        int RoundedDTUnit = 0;

        switch (trackingMode)
        {
            case UnitToTrackEnum.Minute:
                {
                    RoundedDTUnit = dt.Minute;
                    break;
                }
            case UnitToTrackEnum.FiveMinute:
                {
                    RoundedDTUnit = System.Math.Abs(dt.Minute / 5);
                    break;
                }
            case UnitToTrackEnum.TenMinute:
                {
                    RoundedDTUnit = System.Math.Abs(dt.Minute / 10);
                    break;
                }
            case UnitToTrackEnum.FifteenMinute:
                {
                    RoundedDTUnit = System.Math.Abs(dt.Minute / 15);
                    break;
                }
            case UnitToTrackEnum.Hour:
                {
                    RoundedDTUnit = dt.Hour;
                    break;
                }
            case UnitToTrackEnum.Day:
                {
                    RoundedDTUnit = dt.Day;
                    break;
                }
            case UnitToTrackEnum.Week:
                {
                    //RoundedDTUnit = System.Math.Abs( );
                    break;
                }
            case UnitToTrackEnum.Month:
                {
                    RoundedDTUnit = dt.Month;
                    break;
                }
            case UnitToTrackEnum.unknown:
                {
                    throw new InvalidOperationException("You must not have an unknown measure of time to track.");
                }
            default:
                break;
        }


        bool DoRefreshMaxMin = false;
        if (FloatsToTrack.Length < RoundedDTUnit)
        {
            if (value == float.MaxValue || value == float.MinValue)
            {
                // If invalid data...
                lock (Gate)
                {
                    // Get rid of old data...
                    var OldValue = FloatsToTrack[RoundedDTUnit];
                    if (OldValue != float.MaxValue || OldValue != float.MinValue)
                    {
                        Sum -= OldValue;
                        ValidFloats--;

                        if (OldValue == Max || OldValue == Min)
                            DoRefreshMaxMin = true;
                    }

                    // Save new data
                    FloatsToTrack[RoundedDTUnit] = value;
                }
            }
            else
            {
                lock (Gate)
                {
                    // Get rid of old data...
                    var OldValue = FloatsToTrack[RoundedDTUnit];
                    if (OldValue != float.MaxValue || OldValue != float.MinValue)
                    {
                        Sum -= OldValue;
                        ValidFloats--;
                    }

                    // Save new data
                    FloatsToTrack[RoundedDTUnit] = value;
                    Sum += value;
                    ValidFloats++;

                    if (value < Min)
                        Min = value;

                    if (value > Max)
                        Max = value;

                    if (OldValue == Max || OldValue == Min)
                        DoRefreshMaxMin = true;
                }
            }

            // Function is placed here to avoid a deadlock
            if (DoRefreshMaxMin == true)
                RefreshMaxMin();
        }
        else
        {
            throw new IndexOutOfRangeException("Index " + RoundedDTUnit + " is out of range for tracking mode: " + trackingMode.ToString());
        }
    }

    public float Sum { get; set; }
    public float Average
    {
        get
        {
            if (ValidFloats > 0)
                return Sum / ValidFloats;
            else
                return float.MaxValue;
        }
    }
    public float Min { get; set; }
    public float Max { get; set; }
    public float Derivative { get; set; }

    public void RefreshCounters()
    {
        lock (Gate)
        {
            float sum = 0;
            ValidFloats = 0;

            Min = float.MaxValue;
            Max = float.MinValue;

            foreach (var i in FloatsToTrack)
            {
                if (i != float.MaxValue || i != float.MinValue)
                {
                    if (Min == float.MaxValue)
                    {
                        Min = i;
                        Max = i;
                    }

                    sum += i;
                    ValidFloats++;

                    if (i < Min)
                        Min = i;

                    if (i > Max)
                        Max = i;
                }
            }
            Sum = sum;
        }
    }
    public void RefreshMaxMin()
    {
        if (ValidFloats > 0)
        {
            Min = float.MaxValue;
            Max = float.MinValue;

            lock (Gate)
            {
                foreach (var i in FloatsToTrack)
                {
                    if (i != float.MaxValue || i != float.MinValue)
                    {
                        if (i < Min)
                            Min = i;

                        if (i > Max)
                            Max = i;
                    }
                }
            }
        }
    }
}

你应该考虑看看CEP http://en.wikipedia.org/wiki/Complex_event_processing像图书馆一样Nesper http://esper.codehaus.org/about/nesper/nesper.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过内存/CPU 效率分析特定时间间隔内的近实时数据所需的想法 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • Coredata - “NSObjectInaccessibleException - CoreData 无法完成错误”

    我是核心数据的新手 仍在弄清楚具体细节 这个错误已经困扰我几个小时了 我似乎找不到解决方案 任何帮助是极大的赞赏 问题是这样的 我有两个视图 它们从服务器获取数据并更新 UI 我已经这样设置流程了 view1 gt 从服务器发送 HTTP
  • 使用 TSA URL 和 Java API 进行时间戳记

    任何人都可以帮助我理解为签名添加时间戳时使用的流程和 Java API 我需要使用 TSA url 对文件进行签名并为其添加时间戳 http timestamp globalsign com scripts timstamp dll htt
  • 延迟加载 GTM 是个好主意吗

    为了缩短我正在开发的 Web 应用程序的初始加载时间 我想在加载应用程序后运行 GTM 脚本 我想知道这是否是一个好主意 如果我这样做 可能会产生什么副作用 TL dr 看来懒加载GTM也可以 长版 一般来说 我会按照创建者建议的方式运行脚
  • ZF2路由配置

    我刚刚构建了一个 zf2 项目 但遇到了配置问题 当我访问 mydomain com 时 此路由按照配置文件中指定的方式发送到应用程序模块 索引控制器 索引操作 但是如果我输入 mydomain com otheraction 这不会路由到
  • Django {{ MEDIA_URL }} 空白 @DEPRECATED

    在过去的几个小时里 我一直在为这个问题绞尽脑汁 我无法显示 MEDIA URL 在设置 py MEDIA URL http 10 10 0 106 ame TEMPLATE CONTEXT PROCESSORS django contrib
  • 如何使用 Material Design Lite 设置选择框格式?

    我已经通读了组件列表并通读了提供的 CSS 但我没有看到任何提及选择框的内容 只是常规输入 文本 单选 复选框 文本区域等 如何将 Material Design Lite 与选择框结合使用 使用这些类进行常规文本输入可以让您成功一半 但这
  • 如何创建指向网页某个子部分的深层链接?

    有谁知道如何创建指向单个网页的一小部分的深层链接 维基百科似乎已经破解了它 但我似乎无法在网络上的任何地方找到答案 PS 保持简单 仅当目标包含构成可在片段标识符中使用的 目标锚 的标记时 才可以链接到页面上的特定位置或元素 以 在链接中
  • java.awt.AWTError:无法使用 ':0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器

    我一直在尝试运行一个Docker 内 Ubuntu VM 上基于 Java AWT 的应用程序 该应用程序非常简单 并且可以通过 Eclipse 在 Windows 上完美运行 它只是打开一个窗口并打印 hello world 事实上 当我
  • 突出显示 pandas 图中的最后一个数据点

    我有很多与此类似的图表 import pandas as pd dates pd date range 2012 01 01 2013 02 22 y np random randn len dates 365 Y pd Series y
  • 为什么当路径满足时 NWPathMonitor 不给出路径更新?

    我有一个简单的类名为网络路径监视器看起来如下 class NetworkPathMonitor ObservableObject Cancellable Published var path NWPath nil let monitor N
  • 编译器可以优化从堆到堆栈的分配吗?

    就编译器优化而言 将堆分配更改为堆栈分配是否合法和 或可能 或者这会打破假设规则 https stackoverflow com questions 15718262 what exactly is the as if rule 例如 假设
  • 为什么当构建错误退出时,来自 docker 文件的 docker 构建镜像会创建容器?

    我正在使用 docker 从 docker 文件构建图像 在此过程中发生了一些错误 因此构建退出并显示错误代码 当我跑步时docker images我可以看到未标记的图像 所以我尝试删除它docker rmi xxxxx 但它总是失败 它说
  • 通过react-image-crop模块获取裁剪后的图像

    你能帮我如何通过react image crop模块获得输出 裁剪图像的来源 吗 上传组件如下所示 class MyUpload extends Component constructor super this state src sour
  • 无法在 64 位 Linux 上运行 32 位应用程序

    我安装了 Ubuntu 8 04 64 位的最小安装版 当我尝试运行一些 32 位程序时 例如我的jhead程序 我收到消息No such file or directory 我认为这可能是一个库问题 但是当我这样做时 ldd jhead
  • 将特征用户描述添加到多个自定义 C++ BLE GATT 服务

    我正在尝试使用以下命令将一些特征用户描述添加到我的自定义 BLE GATT 服务中mbed API https developer mbed org teams Bluetooth Low Energy 到目前为止我的工作是基于this h
  • 在 Windows 7 上安装调试工具来分析小型转储

    我一直在尝试安装 调试工具 以便尝试分析服务器崩溃 Windows Server 2008 R2 的转储文件 我过去曾经这样做过 但我找不到如何安装 找到 Windows 7 的调试工具 我读过这篇知识库文章 http support mi
  • CMake 无法从已安装的 Visual Studio 2015 中识别 C 编译器

    我一直在尝试为 vtk 安装 CMake 但收到此错误消息 The C compiler identification is unknown The CXX compiler identification is unknown 我正在使用
  • 将函数存储在列表中并稍后调用它们[重复]

    这个问题在这里已经有答案了 我想将函数存储在列表中 然后在程序中调用该列表中的这些函数 这对我有用 但是我不知道它是否正确 example functions my functions would actually get user inp
  • android AudioRecord 从 MIC 读取幅度

    我正在尝试录制麦克风的声音并绘制实时图表 我能够记录并绘制图表 问题是使用下面的代码记录的值不准确 例如 下图是我在完全没有声音时得到的结果 我看过使用 fft 的示例 但我不确定这对我的情况是否有任何帮助 因为我正在尝试绘制时域图 并且我
  • 通过内存/CPU 效率分析特定时间间隔内的近实时数据所需的想法

    我有一些环境传感器 我想检测温度的突然变化 以及随着时间的推移缓慢的趋势 但是我想根据内存中的参数进行大部分数学计算 参数可能如下所示 取决于改变 注 括号中的项目是在添加数据时实时计算的 5 分钟 导数 最大值 最小值 平均值 最近 3