我需要按照IList实现的巨大时间序列按时间顺序执行操作。数据最终存储在数据库中,但向数据库提交数以千万计的查询是没有意义的。
目前,内存中的IList在尝试存储超过800万(小)对象时会触发OutOfMemory异常,但我需要处理数千万。
经过一些研究,看起来最好的方法是将数据存储在磁盘上并通过IList包装器访问它。
Memory-mapped files(在.NET 4.0中引入)似乎是正确的接口,但我想知道编写一个应该实现IList(为了方便访问)并在内部处理内存的类的最佳方法是什么 - 映射文件。
我也很想知道你是否了解其他方法!我想过一个IList包装器的例子,它使用来自db4o的数据(someone mentionned here使用内存映射文件作为IoAdapterFile,但是使用db4o可能会增加性能成本而不是直接处理内存映射文件)。 p>
我在2009年遇到了this question,但它没有提供有用的答案或认真的想法。
答案 0 :(得分:8)
我发现了这个PersistentDictionary<>,但它只适用于字符串,通过阅读源代码,我不确定它是专为非常大的数据集而设计的。
更具可伸缩性(最高16 TB),ESENT PersistentDictionary<>,使用Windows(XP +)中的ESENT数据库引擎,可以存储包含简单类型的所有可序列化对象。
Disk Based Data Structures, including Dictionary, List and Array with an "intelligent" serializer看起来与我正在寻找的完全一样,但它对于非常大的数据集并不顺利,特别是因为它还没有使用“原生”.NET MemoryMappedFiles,并且支持32位系统是实验性的。
更新1 :我最终实现了自己的版本,广泛使用.NET MemoryMappedFiles;它非常快,我可能会在Codeplex上发布它,一旦我更好地用于更多通用用途。
更新2 :TeaFiles.Net也很适合我的目的。强烈推荐(和免费)。
答案 1 :(得分:3)
我看到了几个选项:
答案 2 :(得分:1)
内存映射文件是一种很好的方法。但如果你需要随机访问它,它会非常缓慢。
您最好的选择是在保存在内存中时提出固定的结构大小(如果可以),然后使用偏移量作为列表项ID。但是删除/排序总是一个问题。