1

我有一个 C# 系统,其中服务器应用程序逐帧接收视频,它的职责是将此帧发送到所有连接的客户端。我有一个线程来完成下载帧和存储的工作。并且其他客户端连接线程将读取这些存储的帧并将它们发送给客户端。现在我怀疑这是为多线程环境存储帧的最佳方式。

我计划了两种方法。一个是我使用 Queue 类并通过锁定包装来使用 enque-deque,另一个方法是将帧转储到一个文件中,该文件由所有读写线程以共享模式打开。哪个更注重性能?有没有其他更好的方法来做到这一点?

我对上述两种方法的一些假设如下。1) 锁定队列会降低性能 2) 文件 IO 不需要锁定,因为文件以共享模式打开并且具有独立的文件指针。3)在队列接近的情况下,需要定义队列长度以管理RAM中的内存限制。并且这些内存限制的约束需要更多的技术来管理队列溢出等其他情况。3)要将相同的帧从队列发送到多个客户端,我需要寻找双端队列的改变。4) 文件 IO 会比队列管理慢。

PS 内存映射文件 IO 能否帮助我在我的场景中实现更高的性能?

请提供任何类型的优点/缺点/评论。谢谢。

4

1 回答 1

1

我认为两者都应该起作用-我真的怀疑锁定和/或从文件系统读取/写入的开销是否与流入/流出数据的速率相当。

说,从理论的角度来看,选择实际上取决于与流入数据的速率相比,流出数据的速度有多快。如果两者几乎相同,那么您可以使用内存结构,因为不太可能您的队列将继续快速填满(因为队列和出队将以几乎相同的速度发生)。

最后,您始终可以选择一种混合方法,这将为您带来两全其美的优势。您可以使用内存队列,但队列元素不必是实际的视频帧 - 它可以是一个数据结构,可以告诉您数据在哪里(在内存中或在文件中)。这样,您的排队/取消排队逻辑独立于数据存储。实际的存储代码可以根据内存可用性决定存储位置 - 例如,您最多可以在内存中存储 50 帧,以后的帧将进入文件(一个或多个)。随着内存中帧的传输,该插槽将变为空,并且下载的下一帧可以到那里。

于 2013-01-08T07:31:21.123 回答