【发布时间】: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