有两个线程data_collect_thread
和data_process_thread
。
data_collect_thread
收集数据并将数据推送到队列中,该速度是data_process_thread
的4倍,后者从队列中取出数据并进行处理。
在这种情况下,与将数据推送到队列相比,由于出队速度较慢,堆在一段时间后溢出。
我无法在data_collect_thread
中等待data_process_thread
处理数据。我需要获取实时数据而不会丢失任何内容。
请提出一种避免该问题的算法?
更多详细信息:
队列是一个双向链接列表,因此我需要在堆中分配内存并将其推入队列。出队后,内存被释放。
答案 0 :(得分:0)
这个问题太宽泛,无法给出具体答案,但是无论如何,恕我直言很有趣。因此,我将提供一些解决方案。
data_process_thread
实例。如果您有多个核心,可能会起作用。data_process_thread
的算法和/或代码。data_process_thread
以在gpu上运行。我可能还要补充一点,如果您对问题添加了足够的约束,那么结果可能无法解决。
答案 1 :(得分:0)
想象一下,您有一个不断向其注水的水箱。您还将通过一条小管道将水从水箱中取出。除非您以比注入水快的速度去除水,否则水箱迟早会始终溢出。在数据处理中也是如此。您必须以等于或高于产生数据的速度消耗数据,否则迟早会耗尽内存。这是生活中的事实。
万一数据突然爆发,并且出现了一些停机时间,那么您可以通过使用足够大的缓冲区将数据保留一段时间来避免处理速度变慢。但就您而言,您似乎正在以固定速率连续进行流式传输或采样。
由于您说您无法控制数据到达的速度,因此您唯一的选择是优化data_process_thread()
,使其运行速度快于数据到达的速度。 2.5毫秒似乎足以进行大量处理。仔细检查您的处理代码并对其进行配置,以了解它在CPU时间上所花费的时间。然后尝试对其进行优化以使其运行更快。
PS:我刚刚在您的评论中看到您正在阅读I2C。假设您是嵌入式微处理器或某种嵌入式微处理器,请尝试使用DMA将数据从I2C外设复制到内存(如果您的微控制器支持的话)。减少中断数量可能会为您腾出更多的CPU时间进行处理。
答案 2 :(得分:0)
您有两种选择:
如果要处理所有数据,则需要尽快处理它们。因此,您需要一台速度更快的计算机或更多台计算机,或者速度更快的处理算法。句号这些是您唯一可以做的事情。
如果您不想处理所有数据,可以这样做,以便如果队列中已有太多数据,则收集线程将删除数据(而不是将其放入队列)。
这些是您的选择。选择一个。