我是否应该始终最小化应用程序中的 IO
Should I always minimize IO in my App
我有一个 C# 桌面应用程序。
它 'reads' 来自 4 台数码相机,一次 1 个 JPEG 帧。
每张JPEG不超过20K字节。
对于检测到的每个动作,我都会将帧保存到我的硬盘中。
另一种存储素材的方法是在我的托管代码中创建 AVI 文件,然后在达到一定大小后将其拆分。
我一次保存 1 张 JPEG 的原因是,如果小偷用应用程序偷了我的电脑 运行 or/and 电脑会自行重启 or/and 应用程序就会停止,然后我将始终能够保存最新的帧。
如果我采用 AVI 方法,我将失去我在代码中设置的任何截止值。
我知道如果窃贼偷了我的电脑,他们也会得到我所有的镜头,但我可以通过保存到存储在保险箱中的外部硬盘驱动器来规避这种情况(例如)。
因此,考虑到要保存的字节数较少(但可能很频繁),这是我希望在内存效率方面达到的最佳效果吗?
谢谢
让我们考虑问题的不同方面。
写入速率
您的最大写入速率为 800KB/s(10 FPS,4 个摄像头,每帧 20KB),这在现代 HDD 上不是很高(即使对于外部硬盘驱动器)。如果您使用的是 SSD,则更不重要。
如何提高写作效率
传统上,通过将数据缓存到缓冲区中并在缓冲区达到一定大小时写入大块数据来提高写入效率。对于您的情况,我认为编写自己的缓冲机制不是一个好主意。
- 大多数操作系统已经有某种缓存机制来防止磁盘抖动和数据碎片。
- 您想将最新的帧写入磁盘,即防止数据丢失。缓存恰恰相反,因为它会延迟写入,并且在发生故障时整个缓冲区可能会丢失(例如,在您的情况下,如果有人拔下设备)。
这就是为什么我认为您应该使您的实施尽可能简单(想想 KISS)。您甚至可以考虑禁用操作系统缓存。这可能会导致更多的数据碎片,但您将确保将最新的帧写入磁盘。 (请注意,对于 SSD,碎片问题无关紧要。)
我有一个 C# 桌面应用程序。
它 'reads' 来自 4 台数码相机,一次 1 个 JPEG 帧。
每张JPEG不超过20K字节。 对于检测到的每个动作,我都会将帧保存到我的硬盘中。
另一种存储素材的方法是在我的托管代码中创建 AVI 文件,然后在达到一定大小后将其拆分。
我一次保存 1 张 JPEG 的原因是,如果小偷用应用程序偷了我的电脑 运行 or/and 电脑会自行重启 or/and 应用程序就会停止,然后我将始终能够保存最新的帧。
如果我采用 AVI 方法,我将失去我在代码中设置的任何截止值。
我知道如果窃贼偷了我的电脑,他们也会得到我所有的镜头,但我可以通过保存到存储在保险箱中的外部硬盘驱动器来规避这种情况(例如)。
因此,考虑到要保存的字节数较少(但可能很频繁),这是我希望在内存效率方面达到的最佳效果吗?
谢谢
让我们考虑问题的不同方面。
写入速率
您的最大写入速率为 800KB/s(10 FPS,4 个摄像头,每帧 20KB),这在现代 HDD 上不是很高(即使对于外部硬盘驱动器)。如果您使用的是 SSD,则更不重要。
如何提高写作效率
传统上,通过将数据缓存到缓冲区中并在缓冲区达到一定大小时写入大块数据来提高写入效率。对于您的情况,我认为编写自己的缓冲机制不是一个好主意。
- 大多数操作系统已经有某种缓存机制来防止磁盘抖动和数据碎片。
- 您想将最新的帧写入磁盘,即防止数据丢失。缓存恰恰相反,因为它会延迟写入,并且在发生故障时整个缓冲区可能会丢失(例如,在您的情况下,如果有人拔下设备)。
这就是为什么我认为您应该使您的实施尽可能简单(想想 KISS)。您甚至可以考虑禁用操作系统缓存。这可能会导致更多的数据碎片,但您将确保将最新的帧写入磁盘。 (请注意,对于 SSD,碎片问题无关紧要。)