使用内存映射文件的缺点
本文关键字:缺点 文件 映射 内存 | 更新日期: 2023-09-27 17:53:12
我的web服务每分钟写入数千个事务,我们将它们保存在hd上。
我正在测试不同的方法来保存这些文件,我用标准IO和memorymap文件做了一些测试。在我的结果中,用memorymap文件写文件(20k文本文件)比标准IO快4倍,我没有发现任何缺点。
由于我对这项技术没有太多的经验,你认为我使用它们会遇到任何问题吗?还是你认为没有任何缺点?
谢谢!
EDIT 1,这里是源代码:
namespace FileWritingTests.Writers {
public class MappedFileWriter : ITestWriter {
public void Write(string content, string path,string id) {
Byte[] data = System.Text.Encoding.UTF8.GetBytes(content);
using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, id, data.Count(),
MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true)) {
var viewStream = memoryMapped.CreateViewStream();
viewStream.Write(data, 0, data.Length);
}
}
}
}
,这是测试器:
public TimeSpan Run(int iterations, Writers.ITestWriter tester, String subfolder) {
Console.WriteLine(" -- Starting test {0} with {1} file writings",subfolder, iterations.ToString());
Stopwatch stopWatch = new Stopwatch();
stopWatch.Reset();
stopWatch.Start();
for (int i = 1; i <= iterations; i++) {
tester.Write(transaction, this.path + "''" + subfolder + "''" + "file_" + i.ToString() + ".txt", i.ToString());
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Console.WriteLine(" -- finish test {0} with {1} file writings. Time Elapsed: {2}", subfolder, iterations.ToString(), ts.TotalMilliseconds);
return ts;
}
测试器被调用了几次,并且有几种类型的测试器被调用进行比较。
mmf的主要缺点是它们消耗RAM,使文件系统缓存效率降低。
另一个缺点(虽然肯定是有意为之)是您无法再度量写文件的成本。现在这是一个由内核完成的工作,而不是你的程序。当然了,天下没有免费的午餐。它与程序的其余执行是并发的,可以说是自由线程。在任务管理器中密切关注"System"进程的CPU利用率。同样,对于如此小的文件,这也不太可能成为问题。
这是一个微优化,被创建文件的成本吹走了。它在主轴磁盘驱动器上停留20到50毫秒。别忘了把它包括在你的测量中。写入文件数据以内存总线速度运行,根据机器的RAM类型,最高可达5gb/秒。您所删除的只是低级的WriteFile()调用,它们现在由内核完成。您可以尝试使用FileStream进行测试,使用接受bufferSize值的构造函数。默认值是4096字节,将其增加到32K,因此只有一个WriteFile()调用。这样做的主要优点是,您不必预先猜测MMF的大小。