我们正在开发一种多传感器采集工具,我们遇到了将图像(从网络摄像头)保存到硬盘驱动器的问题。
我们正在为此目的使用三个线程:
这适用于低频率。当我们将FPS提高到30左右时,我们开始丢失图像。请注意,我们有多个传感器而不仅仅是网络摄像头。这就是为什么我们使用这种架构而不是直接从网络摄像头线程保存文件(我们需要保持所有内容同步)
这是save方法的当前实现:
private void saveImageFrame(Bitmap b, ulong frameID)
{
string fileSavePath = _path+ "//";
if (b != null)
{
Task.Factory.StartNew(() =>
{
lock (_lock)
{
Bitmap toSave = new Bitmap(b);
string fileName = fileSavePath + frameID.ToString() + ".bmp";
toSave.Save(fileName);
}
});
}
}
我们也试过没有任务线程(用于保存)而没有锁定。这两个导致竞争条件,因为保存比定时器时间间隔花费更多时间。
我确信在架构和.NET功能方面都有更好的方法。任何有助于提高性能的帮助都将不胜感激!
答案 0 :(得分:4)
你的磁盘很可能不够快。一个非常快的磁盘子系统可以支持每秒100兆字节的写入速度,如果你已经打开了文件就行了。您尝试每秒创建30个或更多文件,这本身就是系统上相当大的负载。添加写入数据所需的时间,并且您正在推动文件系统的功能。
随着文件夹中文件数量的增加,问题会变得更严重。如果您在文件夹中有1,000个文件,那么事情就会很快发挥作用。将10,000个文件放在一个文件夹中,您会发现很长时间需要在该文件夹中创建一个新文件。
如果您遇到硬件性能限制,您可以采取以下几种方法: