c# - 内存映射文件 IList 实现,用于存储大型数据集 "in memory"?

标签 c# .net memory-management collections memory-mapped-files

我需要对作为 IList 实现的庞大时间序列按时间顺序执行操作。数据最终存储到数据库中,但是向数据库提交数千万个查询是没有意义的。

目前,内存中的 IList 在尝试存储超过 800 万(小)对象时会触发 OutOfMemory 异常,尽管我需要处理数千万个对象。

经过一些研究,看起来最好的方法是将数据存储在磁盘上并通过 IList 包装器访问它。

Memory-mapped files (在 .NET 4.0 中引入)似乎是正确的接口(interface),但我想知道编写应实现 IList(以便于访问)并在内部处理内存映射文件的类的最佳方法是什么。

我也很想知道您是否知道其他方法!我想到了一个使用来自 db4o 的数据的 IList 包装器的例子(someone mentionned here 使用内存映射文件作为 IoAdapterFile,尽管使用 db4o 可能会增加性能成本,而不是直接处理内存映射文件)。

我遇到过this question 2009 年提出的问题,但没有产生有用的答案或严肃的想法。

最佳答案

我找到了这个 PersistentDictionary<> ,但它只适用于字符串,通过阅读源代码,我不确定它是为非常大的数据集设计的。

更具可扩展性(高达 16 TB),ESENT PersistentDictionary<> , 使用 Windows (XP+) 中的 ESENT 数据库引擎,可以存储所有包含简单类型的可序列化对象。

Disk Based Data Structures, including Dictionary, List and Array with an "intelligent" serializer看起来与我正在寻找的完全一样,但它在超大数据集上运行不流畅,特别是因为它还没有使用“ native ”.NET MemoryMappedFiles,并且对 32 位系统的支持是实验性的。

更新 1:我最终实现了自己的版本,该版本广泛使用了 .NET MemoryMappedFiles;它非常快,一旦我改进了它以用于更通用的用途,我可能会在 Codeplex 上发布它。

更新 2:TeaFiles.Net也很适合我的目的。强烈推荐(免费)。

关于c# - 内存映射文件 IList 实现,用于存储大型数据集 "in memory"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421685/

相关文章:

c# - 透视图像失真

c# - 将硬编码的 switch 语句转换为动态加载的多键一值查找

c# - 如何从 .NET 调用 C 库

c# - C# 中的 WPF 类型初始化异常

c# - 如何从 PDF 转换为 XPS?

arrays - 如何操作*大量*数据

c# - 如何将 NonNullable 引用属性标记为安全?

c# - Linq、模拟联接和 Include 方法

memory-management - 进程虚拟地址空间和内核地址空间?如何?

c - 中型内存分配的最佳大小是多少?