高效地将图像文件保存到磁盘c#
我们正在开发一个多传感器采集工具,在将图像(从网络摄像头)保存到硬盘驱动器时遇到问题 为此,我们使用了三个线程:高效地将图像文件保存到磁盘c#,c#,multithreading,bitmap,save,sensor-fusion,C#,Multithreading,Bitmap,Save,Sensor Fusion,我们正在开发一个多传感器采集工具,在将图像(从网络摄像头)保存到硬盘驱动器时遇到问题 为此,我们使用了三个线程: 一个线程,连续从网络摄像头收集捕获的图像 一个计时器线程,用于收集最后一个图像并将其发送到文件保存方法 计时器线程调用第三个线程进行保存,以避免干扰主计时器线程功能 这适用于低频。当我们将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个文件放在一个文件夹中,您会发现在该文件夹中创建新文件需要很长时间 如果遇到硬件性能限制,可以采取以下几项措施:
很可能您的磁盘速度不够快。一个真正快速的磁盘子系统可以维持每秒100兆字节的写入速度,如果你已经打开了文件的话。您试图每秒创建30个或更多文件,这本身就是系统上相当大的负载。加上写入数据所需的时间,就可以提升文件系统的功能 随着文件夹中文件数量的增加,该问题将变得更严重。比如说,如果文件夹中有1000个文件,事情会很快发生。将10000个文件放在一个文件夹中,您会发现在该文件夹中创建新文件需要很长时间 如果遇到硬件性能限制,可以采取以下几项措施:
我不确定我是否理解数据流和计时器之类的东西。当网络摄像头线程组装了一个图像实例后,为什么它不立即将该实例排队到保存线程(例如BlockingCollection)并立即为下一个图像创建一个新的实例?因为我们有多个传感器(不仅仅是网络摄像头),我们希望它们都具有相同的密钥(在本例中为FrameID),我们希望它们都由一个提供此密钥的主要组件保存。希望这能澄清我不确定我是否理解数据流和计时器之类的东西。当网络摄像头线程组装了一个图像实例后,为什么它不立即将该实例排队到保存线程(例如BlockingCollection)并立即为下一个图像创建一个新的实例?因为我们有多个传感器(不仅仅是网络摄像头),我们希望它们都具有相同的密钥(在本例中为FrameID),我们希望它们都由一个提供此密钥的主要组件保存。希望这能澄清问题,谢谢你的建议。我们会调查的。那么实施部分呢?我们可以在这里进行任何优化吗?我们考虑使用字节数组而不是位图,并将图像转换为流。你认为这些有什么好处吗?谢谢你的建议。我们会调查的。那么实施部分呢?我们可以在这里进行任何优化吗?我们考虑使用字节数组而不是位图,并将图像转换为流。你认为这些有什么好处吗?