我必须处理对象列表,就像它们在内存中一样,但所有数据都保存在磁盘上。像内存映射文件的东西,但我决定制作一些实现IList
的包装器,但所有函数只是读/写文件流。即(跳过锁/等代码)
public DiskMappedList(string directory)
{
_count = 0;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string fileName = Guid.NewGuid().ToString();
_fileStreamHandle = File.Create(Path.Combine(directory, fileName));
ProtoBuf.Serializer.PrepareSerializer<T>();
}
public void Add(T item)
{
ProtoBuf.Serializer.SerializeWithLengthPrefix(_fileStreamHandle, item, _lengthPrefix, _fieldNum);
_fileStreamHandle.Flush();
_count++;
}
请注意,我使用FileStream
打开的简单File.Open
,只有当对象从内存中删除时才会关闭该流。
尽管事实上只有句柄驻留在内存中,我看到内存使用率很高。 RamMap显示大部分文件是“内存映射文件”。
所以问题是 - 如果我不使用MMF api并且文件仅在我调用ToList()
时加载到内存中,这是非常罕见的,谁将我的所有文件映射到内存?或者可能是“内存映射文件”区域不仅适用于MMF?或者FileStream
可能在内部使用MMF?为什么我看到几个Gb内存使用?