【问题标题】:C# FileStream and Windows Memory cacheC# FileStream 和 Windows 内存缓存
【发布时间】:2020-09-13 07:55:38
【问题描述】:

我正在开发一个应存储一些 PDF 以供以后打印的应用程序。我有一个实现,它正在检查 PDF 的大小,并根据我在内存或文件流之间选择的大小(2GB = FileStream)。

当我使用 FileStream 时,性能会有所不同,我只是注意到这是由 Windows 内存缓存引起的。基本上,我用来写入/读取 FileStream 的所有内容都将进入此缓存,在保存 6 个 PDF 后,我的性能非常低(30 秒与 60 秒以上相比)

我通过以下方式声明我的 FileStream:

FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 524288, FileOptions.WriteThrough))

我刚刚添加了 WriteThrough 选项,但它似乎无法解决问题。 在我将文件保存到磁盘并关闭/处理 FileStream 后,是否有可能清除缓存?

提前感谢您!

__________编辑___________

添加代码 sn-ps。

            loadStream = new FileStream(@"C:\temp\FileStream_test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None, 524288);
            request.InputStream.CopyTo(loadStream);
            loadStream.Flush();
            loadStream.Position = 0;

第二个

        using (var mimePDL = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 524288, FileOptions.WriteThrough))
        {
            mimeParts[contentID].Content.DecodeTo(mimePDL);
            mimePDL.Position = 0;
            mimePDL.Flush(true);
            mimePDL.Close();
            mimePDL.Dispose();
        }

对于第一个,我以这种方式处理它

            loadStream.Close();
            loadStream.Dispose();
            File.Delete(((FileStream)loadStream).Name);

【问题讨论】:

  • 调用垃圾收集器:GC.Collect();
  • @LordPupazz 这样做安全吗?
  • 还可以考虑将FileStream 包含在using 语句中,以确保它在超出范围时被处置。例如:using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 524288, FileOptions.WriteThrough)) { // Do you process here }
  • @GeorgeKerwood 我正在为一个 FileStream 执行此操作。我实际上使用的是 2,其中一个不能包含在 using 语句中,但两者似乎都做同样的事情。
  • 使用大于 128kb 的缓冲区似乎没有任何好处。见optimal buffer size

标签: c# file caching stream filestream


【解决方案1】:

在我看来,如果您不处理 PDF,就不应该将它们存储在内存中。

操作后,只需保存文件并处理流。

如果您需要一些元数据,只需将它们放入您的应用程序而不是整个文件。

【讨论】:

  • 实际上 PDF 包含在提交给我的 MIME 文件中。对于这个 MIME 文件,我处理它的每个部分,对于 PDF 部分,我只是将它保存到磁盘,但在保存它之前,我必须解析整个提交的内容,如果它>2GB,这个内容也会保存到文件流中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2023-03-06
  • 2011-07-27
相关资源
最近更新 更多