Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高效地将图像文件保存到磁盘c#_C#_Multithreading_Bitmap_Save_Sensor Fusion - Fatal编程技术网

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

高效地将图像文件保存到磁盘c#,c#,multithreading,bitmap,save,sensor-fusion,C#,Multithreading,Bitmap,Save,Sensor Fusion,我们正在开发一个多传感器采集工具,在将图像(从网络摄像头)保存到硬盘驱动器时遇到问题 为此,我们使用了三个线程: 一个线程,连续从网络摄像头收集捕获的图像 一个计时器线程,用于收集最后一个图像并将其发送到文件保存方法 计时器线程调用第三个线程进行保存,以避免干扰主计时器线程功能 这适用于低频。当我们将FPS提高到30左右时,我们开始丢失图像。请注意,我们有多个传感器,而不仅仅是一个网络摄像头。这就是为什么我们使用这种架构,而不是直接从网络摄像头线程保存文件(我们需要保持所有内容同步) 这是保

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

为此,我们使用了三个线程:

  • 一个线程,连续从网络摄像头收集捕获的图像
  • 一个计时器线程,用于收集最后一个图像并将其发送到文件保存方法
  • 计时器线程调用第三个线程进行保存,以避免干扰主计时器线程功能
这适用于低频。当我们将FPS提高到30左右时,我们开始丢失图像。请注意,我们有多个传感器,而不仅仅是一个网络摄像头。这就是为什么我们使用这种架构,而不是直接从网络摄像头线程保存文件(我们需要保持所有内容同步)

这是保存方法的当前实现:

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功能方面,都有更好的方法可以做到这一点。我们将非常感谢您对提高本系统性能的任何帮助

很可能是磁盘速度不够快。一个真正快速的磁盘子系统可以维持每秒100兆字节的写入速度,如果你已经打开了文件的话。您试图每秒创建30个或更多文件,这本身就是系统上相当大的负载。加上写入数据所需的时间,就可以提升文件系统的功能

随着文件夹中文件数量的增加,该问题将变得更严重。比如说,如果文件夹中有1000个文件,事情会很快发生。将10000个文件放在一个文件夹中,您会发现在该文件夹中创建新文件需要很长时间

如果遇到硬件性能限制,可以采取以下几项措施:

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

  • 很可能您的磁盘速度不够快。一个真正快速的磁盘子系统可以维持每秒100兆字节的写入速度,如果你已经打开了文件的话。您试图每秒创建30个或更多文件,这本身就是系统上相当大的负载。加上写入数据所需的时间,就可以提升文件系统的功能

    随着文件夹中文件数量的增加,该问题将变得更严重。比如说,如果文件夹中有1000个文件,事情会很快发生。将10000个文件放在一个文件夹中,您会发现在该文件夹中创建新文件需要很长时间

    如果遇到硬件性能限制,可以采取以下几项措施:

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

  • 我不确定我是否理解数据流和计时器之类的东西。当网络摄像头线程组装了一个图像实例后,为什么它不立即将该实例排队到保存线程(例如BlockingCollection)并立即为下一个图像创建一个新的实例?因为我们有多个传感器(不仅仅是网络摄像头),我们希望它们都具有相同的密钥(在本例中为FrameID),我们希望它们都由一个提供此密钥的主要组件保存。希望这能澄清我不确定我是否理解数据流和计时器之类的东西。当网络摄像头线程组装了一个图像实例后,为什么它不立即将该实例排队到保存线程(例如BlockingCollection)并立即为下一个图像创建一个新的实例?因为我们有多个传感器(不仅仅是网络摄像头),我们希望它们都具有相同的密钥(在本例中为FrameID),我们希望它们都由一个提供此密钥的主要组件保存。希望这能澄清问题,谢谢你的建议。我们会调查的。那么实施部分呢?我们可以在这里进行任何优化吗?我们考虑使用字节数组而不是位图,并将图像转换为流。你认为这些有什么好处吗?谢谢你的建议。我们会调查的。那么实施部分呢?我们可以在这里进行任何优化吗?我们考虑使用字节数组而不是位图,并将图像转换为流。你认为这些有什么好处吗?