我有一组大对象(超过20GB),需要从应用程序快速访问。
到目前为止,在应用程序启动时,我已经从磁盘将这些文件读取到RAM。这是一项昂贵的任务,因为文件会反序列化为内存中的对象。但是,在加载这些文件的最初启动延迟之后,可以非常快速地访问对象。但是,现在文件的大小现在太大了,无法存储在RAM中。
我现在不得不从磁盘读取部分文件,将它们反序列化到内存中,然后丢弃已使用的内存,读取下一个文件,依此类推。由于反序列化,这在计算上非常昂贵。
有没有一种方法可以让我的“内存中”对象指向磁盘上存储的内存空间?这将比驻留在RAM中的访问要慢,但是对磁盘而不是RAM的访问仍然比重复反序列化我怀疑的数据要快。
有没有办法做到这一点?
数据btw本质上是一个需要迭代的结构列表。
答案 0 :(得分:3)
如果本质上是结构列表,则可以:您可以在此处使用内存映射文件。最有效的方法是在数据上创建一个单一的大型视图(让操作系统不必担心对其进行映射和分页),并获取和存储指向根的非托管指针(您可以从{ {1}},但IIRC有更直接的方法来获取它。
现在;您不想想要做的两件事:
但是:您可以将block
和<p>
用作您的朋友; System.Runtime.CompilerServices.Unsafe
可以在MemoryMappedViewStream
和ref T
之间进行黑客入侵,Span<T>
可以使用void*
;这为您提供了两种简单的方法来处理保存在非托管内存中的ref T
数据。