问题标签 [circular-buffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - c 中的一个消费者多个生产者在完全缓冲后恢复时防止赛车
我制作了一个循环缓冲区,多个客户端将不同长度的消息写入缓冲区。服务器将它们读出。它基于消费者/生产者问题的代码。问题是当缓冲区已满并且服务器从缓冲区中删除所有数据时,客户端收到信号以恢复其写入操作,但另一个客户端(在另一个线程中)开始在缓冲区中写入消息。我希望在缓冲区满之前已经在写入的客户端恢复它的操作,这样消息就不会乱序到达。
这是我的代码(我删除了很多测试代码)
vb.net - 高速环形缓冲器
我被要求提高用于高速数据采集的应用程序的内存效率。在多次运行 VS 内存分析器并扫描项目以查找明显问题后,我得出以下结论:尽管使用固定大小的循环缓冲区来存储获取的样本点,但 RAM 使用量相对于轮询周期会增加。例如:在 2 微秒内轮询一个信号的数据可以使用比以 50 微秒运行时多 5 倍的内存(私有字节)......即使缓冲区大小相同。
循环缓冲区是一组 SamplePoint 对象。这些对象中的每一个都包含一组 Shorts(16 位)用于每个信号的相应数据和一个日期对象(8 个字节)用于时间戳。为提高效率,循环缓冲区每次开始轮询时仅重新调整一次,并填充空样本点,然后“分配”。
此外,似乎当我们停止并运行应用程序时,它每次都会占用更多内存,就好像 Redim 没有释放先前的数组一样。
我的问题归结为以下几点:
实现包含具有数组的托管对象的循环缓冲区的最节省内存的方法是什么?此外,具有不同轮询速度的固定大小数组如何以及为什么会增加内存使用量?垃圾收集器没有时间吗?当子或函数退出时,局部变量是否会立即被处理掉?
这些是我想在继续之前排除的一些疑虑和担忧。感谢您抽出宝贵时间。另外,我可以发布代码,但这将毫无意义,因为它有很多并且分散了。
编辑:这是我编写的一些精简代码,反映了循环缓冲区的初始化、填充和重置。看到任何错误?
c++ - C++中的环形数据结构
可能重复:
C++ 是否存在循环列表的标准实现?
我正在寻找一种访问行为“类似环形”的数据结构,因此如果我增加迭代器并达到结尾,它将被重置为开头。如果我添加数据,大小应该会增加。
我认为boost::circular_buffer
这不是我要找的,因为插入的行为是环状的。我的名单应该被允许无限增长。
有没有一种标准的方法呢?我可以很容易地找到解决方法,但很好奇是否存在这样的东西。一个链表,其末端总是连接到第一个元素或类似的元素。
更新
如s3rius
建议的那样,我查看了一个类似的问题,并且有一个示例如何为此类事情编写自己的迭代器。我会试试这个,也投票赞成关闭。
java - Java中的线程安全循环缓冲区
考虑一些并行运行的 Web 服务器实例。每个服务器都持有对单个共享“状态保持器”的引用,其作用是保持N
来自所有服务器的最后请求。
例如 ( N=3
):
在任何时间点,“状态保持器”可能会从读取这些最后N
的 SLA 报告请求的监视应用程序中调用。
在 Java 中实现这个生产者-消费者场景的最佳方式是什么,给 Web 服务器比 SLA 报告更高的优先级?
CircularFifoBuffer似乎是保存请求的合适数据结构,但我不确定实现高效并发的最佳方式是什么。
c# - Silverlight 中的循环队列功能
我正在 Silverlight 3.0 中制作应用程序 在该应用程序中,我想实现如下功能:我必须维护值的集合。我不断地从一端添加该集合中的值并从另一端删除值。意味着假设我想维护一个包含 3000 个值的集合。如果我在该集合中添加一个值,则应删除一个值,以便我只有 3000 个值的集合。我想使用“循环队列” 那么循环队列的 Silverlight 中是否有任何功能?还是有任何有效的逻辑来代替循环队列?请帮助我。在此先感谢。
c - 如何将字符串插入缓冲区?
我是 C 编程的新手。我想创建将字符串写入文本文件的循环缓冲区。
问题是如何将字符串插入循环缓冲区,然后将它们写入文本文件?此实现仅适用于数字。
c++ - 如何在 C++ 中使用无锁循环缓冲区实现零拷贝 tcp
我有多个线程需要使用 TCP 流中的数据。我希望使用共享内存中的循环缓冲区/队列从 TCP 套接字读取。TCP 接收将直接写入循环队列。消费者将从队列中读取。
这种设计应该能够实现零拷贝和零锁定。但是这里有两个不同的问题。
从 TCP 套接字中仅读取 1 条逻辑消息是否可能/有效?如果没有,并且我阅读了超过 1 条消息,我将不得不将残差从 this 复制到 this->next。
真的可以实现无锁队列吗?我知道有原子操作,但这些也可能很昂贵。因为所有的 CPU 缓存都需要失效。这将影响我所有 24 个内核上的所有操作。
我对低级 TCP 有点生疏,并且不清楚如何判断消息何时完成。我是在寻找 \0 还是特定于实现?
泰
android - 如何创建循环列表视图或在循环视图中填充值?
可能重复:
如何创建一个封闭的(圆形)ListView?
我对android很陌生,我想以循环格式创建一个列表视图。无论如何要这样做或创建某种循环布局?如果普通列表视图以垂直方式填充值,我希望有一个列表视图以循环格式填充值谢谢
clojure - Clojure 循环数据结构必须涉及像 ref 这样的构造吗?
今天我看到了一些关于打结和循环数据结构的参考资料。我一直在阅读一些答案,解决方案似乎涉及使用 ref 指向列表的头部。一个特定的SO 问题显示了一个 Haskell 示例,但我不太了解 Haskell,无法知道该示例是否使用了 Haskell 等效的 ref。
有没有办法在不使用 ref 或类似构造的情况下使 Clojure 数据结构循环?
谢谢。
c++ - 处理仪器捕获数据
我有一个产生数据流的仪器;我的代码通过回调访问这些数据onDataAcquisitionEvent(const InstrumentOutput &data)
。数据处理算法可能比数据到达的速度慢得多,所以我不能希望处理每一条数据(我也不必),但希望处理尽可能多的数据。感谢该仪器作为环境传感器,具有我无法控制的数据采集速率。InstrumentOutput
例如,可以是一个包含不同位置的三个同时压力测量值的类。
我还需要保留一些简短的数据历史记录。例如,假设我可以合理地希望每 200 毫秒左右处理一次数据样本。大多数时候,我很乐意只处理最后一个样本,但有时我需要查看在最新样本之前到达的几秒钟的数据,具体取决于最后一个样本中是否存在异常读数。
另一个要求是尽快退出onDataAcquisitionEvent()
回调,以避免传感器中的数据丢失。
数据采集库(第三方)在单独的线程上收集仪器数据。
我想到了以下设计;拥有单个生产者/单个消费者队列,并将数据令牌推送到 onDataAcquisitionEvent() 回调中的同步队列中。
在接收端,有一个循环从队列中弹出数据。由于数据到达率很高,循环几乎永远不会休眠。在每次迭代中,都会发生以下情况:
- 从队列中弹出所有可用数据,
- 弹出的数据被复制到一个循环缓冲区(我使用了 boost 循环缓冲区),这样一些历史总是可用的,
- 处理缓冲区中的最后一个元素(并可能查看之前的元素),
- 重复循环。
问题:
- 这种设计是否合理,有哪些陷阱?和
- 有什么更好的设计?
编辑:我想到的一个问题是当循环缓冲区的大小不足以容纳所需的历史时;目前我只是重新分配循环缓冲区,使其大小增加一倍。我希望我只需要这样做一两次。