如果我不使用MemoryMappedFile,谁将文件映射到内存

时间:2018-04-12 12:34:56

标签: c# memory-management memory-mapped-files

我必须处理对象列表,就像它们在内存中一样,但所有数据都保存在磁盘上。像内存映射文件的东西,但我决定制作一些实现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内存使用?

PS:一些截图 enter image description here enter image description here

0 个答案:

没有答案