存储在磁盘上的C#对象(MemoryMappedFile?)

时间:2018-07-30 19:57:52

标签: c#

我有一组大对象(超过20GB),需要从应用程序快速访问。

到目前为止,在应用程序启动时,我已经从磁盘将这些文件读取到RAM。这是一项昂贵的任务,因为文件会反序列化为内存中的对象。但是,在加载这些文件的最初启动延迟之后,可以非常快速地访问对象。但是,现在文件的大小现在太大了,无法存储在RAM中。

我现在不得不从磁盘读取部分文件,将它们反序列化到内存中,然后丢弃已使用的内存,读取下一个文件,依此类推。由于反序列化,这在计算上非常昂贵。

有没有一种方法可以让我的“内存中”对象指向磁盘上存储的内存空间?这将比驻留在RAM中的访问要慢,但是对磁盘而不是RAM的访问仍然比重复反序列化我怀疑的数据要快。

有没有办法做到这一点?

数据btw本质上是一个需要迭代的结构列表。

1 个答案:

答案 0 :(得分:3)

如果本质上是结构列表,则可以:您可以在此处使用内存映射文件。最有效的方法是在数据上创建一个单一的大型视图(让操作系统不必担心对其进行映射和分页),并获取和存储指向根的非托管指针(您可以从{ {1}},但IIRC有更直接的方法来获取它。

现在;您不想想要做的两件事:

  • 不断处理非托管指针
  • 不断复制数据

但是:您可以将block<p>用作您的朋友; System.Runtime.CompilerServices.Unsafe可以在MemoryMappedViewStreamref T之间进行黑客入侵,Span<T> 可以使用void* ;这为您提供了两种简单的方法来处理保存在非托管内存中的ref T数据。