有效地将图像文件保存到磁盘c#

时间:2013-09-04 07:10:16

标签: c# multithreading bitmap save sensor-fusion

我们正在开发一种多传感器采集工具,我们遇到了将图像(从网络摄像头)保存到硬盘驱动器的问题。

我们正在为此目的使用三个线程:

  • 一个连续从网络摄像头收集捕获图像的线程。
  • 计时器线程,用于收集最后一个图像并将其发送到文件保存方法。
  • 计时器线程调用第三个线程进行保存,以免干扰主计时器线程功能。

这适用于低频率。当我们将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功能方面都有更好的方法。任何有助于提高性能的帮助都将不胜感激!

1 个答案:

答案 0 :(得分:4)

你的磁盘很可能不够快。一个非常快的磁盘子系统可以支持每秒100兆字节的写入速度,如果你已经打开了文件就行了。您尝试每秒创建30个或更多文件,这本身就是系统上相当大的负载。添加写入数据所需的时间,并且您正在推动文件系统的功能。

随着文件夹中文件数量的增加,问题会变得更严重。如果您在文件夹中有1,000个文件,那么事情就会很快发挥作用。将10,000个文件放在一个文件夹中,您会发现很长时间需要在该文件夹中创建一个新文件。

如果您遇到硬件性能限制,您可以采取以下几种方法:

  1. 获得更快的硬件。例如,第二个非常快速的专用驱动器。
  2. 减少您创建的文件数量。也许您可以以压缩格式保存多个图像,然后将它们全部作为单个文件写入磁盘(例如,zip文件)。或者降低帧速率。
  3. 减少您编写的数据量(通过压缩或缩小图像大小)。