【问题标题】:Is it safe to keep C# Filestream open for long periods of time?长时间保持 C# Filestream 打开是否安全?
【发布时间】:2012-11-07 19:10:48
【问题描述】:

在我的网络服务中,我打开一个文件流到本地磁盘上的一个文件。我会在服务的整个生命周期内保留它。对于传入的每个查询,我使用文件流来读取磁盘。 我这样做是为了避免在每次查询时都必须重新打开文件流。这条路径的延迟很关键(应该少于几毫秒)。我使用 SSD 将磁盘 IO 时间保持在 0.1 毫秒或更短。

文件流能否在很长一段时间(几天)内“变坏”(变得无效)。在每个查询中重新打开文件流是否更安全?如果我必须重新打开,那么每秒多次重新打开文件流的开销是多少?

【问题讨论】:

  • 如果您担心延迟,是否有理由不将文件内容加载到静态内存中?我认为问题应该是您应该使用什么模式来快速访问内容。
  • 文件太大而无法放入内存。我有一个索引,可以让我直接寻找正确的偏移量并从那里读取。它不应该超过 1 个 IO。读取的数据量小。
  • 您是否编写了一个测试工具来尝试打开单个文件流与打开和关闭。我建议您尝试为此编写一个测试并比较结果。
  • 基本测试显示性能没有显着差异。但是我还没有创建一个发送真实查询的压力测试,所以不确定它在负载下会如何表现。你是对的,我应该。
  • 我很想听听你的结果。如果差异可以忽略不计,那么我建议始终关闭以限制失败的机会。

标签: c# file-io filestream


【解决方案1】:

只要您需要,保持文件打开是安全的。

这对您的情况是否有利 - 您需要自己决定。重新打开文件不应该很慢(即使在常规驱动器上),但您需要尝试衡量自己,但您知道自己的确切性能目标。

【讨论】:

  • 选择这个作为答案,即使另一个给出了很好的建议,因为这是我问题的唯一直接答案。
【解决方案2】:

让文件保持打开状态的唯一担心是应用程序是否因任何原因而失败,并且无法从当前位置恢复以关闭流;用于打开文件的KERNEL32 中的CreateFile 入口点声明如下:

当应用程序使用完 CreateFile 返回的对象句柄后,使用 CloseHandle 函数关闭句柄。这不仅可以释放系统资源,而且可以对共享文件或设备以及将数据提交到磁盘等事情产生更广泛的影响。本主题中会酌情注明具体细节。

所以我认为每次打开和关闭FileStream 会更合适。

【讨论】:

  • 我同意,让文件长时间打开以供阅读似乎是一种风险,并且违反了打开、阅读然后关闭资源的最佳做法。
  • 谢谢,听起来正确的做法是每次都重新打开。
  • @user201511,请记住将其标记为我自己和社区其他人的答案。
  • 不确定我是否理解您所说的“将其标记为我自己和社区其他人的答案”是什么意思。您的意思是将此标记为已接受的答案吗?我已经选择了一个。
猜你喜欢
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多