【问题标题】:Should I always minimize IO in my App我是否应该始终最小化我的应用程序中的 IO
【发布时间】:2015-10-03 05:37:40
【问题描述】:

我有一个 c# 桌面应用程序。

它一次从 4 个数码相机“读取”1 个 JPEG 帧。

每个 JPEG 不超过 20K 字节。 对于检测到的每一个运动,我都会将帧保存到我的硬盘中。

另一种存储素材的方法是在我的托管代码中创建 AVI 文件,并在建立一定大小后将其拆分。

我一次保存 1 个 JPEG 的原因是,如果窃贼在应用程序运行的情况下窃取了我的电脑或/并且电脑自行重新启动或/并且应用程序刚刚停止,那么我将始终能够保存最新的帧。

如果我采用 AVI 方法,我将丢失我在代码中设置的任何截止值。

我知道,如果窃贼偷走了我的电脑,他们也会拥有我的所有镜头,但我可以通过将其保存到存储在保险箱中的外部硬盘驱动器(例如)来规避这一点。

那么,考虑到要保存的字节数很少(但可能很频繁),这是我希望在内存效率方面达到的最佳效果吗?

谢谢

【问题讨论】:

  • 取决于 FPS。你每秒保存多少帧?此外,在大多数情况下,您可以检测到系统何时关闭,因此这不是真正的问题。
  • @Kryptos 感谢您的评论。我在问题中提到的 FPS 是由运动量决定的。但是,有一个 10FPS 的上限。如果设备被盗,这仍然是一个问题。窃贼不太可能以正确的方式关闭 Windows。他们更容易将电源插头从插座中拔出
  • @closer 为什么这个问题太宽泛了?我以为它很具体?请解释你的推理,以便我修改
  • @2nd Clser。你也没有解释为什么?我认为这是一个直截了当的问题,至少可以解释为什么不是?谢谢

标签: c# disk-io


【解决方案1】:

让我们考虑问题的不同方面。

写作速度

您的最大写入速率为 800KB/s(10 FPS,4 个摄像头,每帧 20KB),这在现代 HDD 上不是很高(即使对于外部硬盘驱动器也是如此)。如果您使用的是 SSD,它就更不重要了。

如何提高写作效率

传统上,通过将数据缓存到缓冲区并在缓冲区达到一定大小时写入大块数据来提高写入效率。就您而言,我认为编写自己的缓冲区机制是个坏主意。

  1. 大多数操作系统已经有某种缓存机制来防止磁盘抖动和数据碎片。
  2. 您希望将最新的帧写入磁盘,即防止数据丢失。缓存恰恰相反,因为它延迟了写入,并且在发生故障时整个缓冲区可能会丢失(例如,在您的情况下,如果有人拔掉设备)。

这就是为什么我认为您应该使您的实现尽可能简单(想想 KISS)。您甚至可以考虑禁用操作系统缓存。这可能会导致更多的数据碎片,但您将确保将最新的帧写入磁盘。 (请注意,对于 SSD,碎片问题无关紧要。)

【讨论】:

  • 非常好 - 谢谢。你给了我对我来说是新的信息。我会采纳你的建议并进行研究。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多