繁体   English   中英

内存映射文件IList实现,用于在内存中存储大型数据集?

[英]Memory-mapped file IList implementation, for storing large datasets “in memory”?

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

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

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

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

如果您了解其他方式,我也很想知道! 我想过使用来自db4o的数据的IList包装器的例子( 这里有人提到使用内存映射文件作为IoAdapterFile,尽管使用db4o可能会增加性能成本而不是直接处理内存映射文件)。

我在2009年遇到过这个问题 ,但它没有产生有用的答案或认真的想法。

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

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

基于磁盘的数据结构,包括带有“智能”序列化程序的字典,列表和数组,看起来与我正在寻找的完全一样,但是对于非常大的数据集,它并不能顺利运行,特别是因为它没有使用“本机”。 NET MemoryMappedFiles,并支持32位系统是实验性的。

更新1 :我最终实现了自己的版本,广泛使用.NET MemoryMappedFiles; 它非常快,我可能会在Codeplex上发布它,一旦我为更多通用用法做得更好。

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

我看到几个选项:

  • “内存-DB”
    例如,SQLite可以这种方式使用 - 不需要任何设置等只需将DLL(1或2)与应用程序一起部署,其余的可以通过编程方式完成
  • 将所有数据加载到数据库的临时表中,使用未知(但很大)的数据量,我发现这个数据的回报非常快(并且处理通常可以在DB内部完成,甚至更好!)
  • 使用MemoryMappedFile和固定的结构大小(通过偏移量的类似阵列的访问)但要注意物理内存是限制,除了你使用某种“滑动窗口”只将部件映射到内存

内存映射文件是一种很好的方法。 但如果你需要随机访问它,它会变得非常慢。

您最好的选择可能是在保存在内存中时提出固定的结构大小(如果可以),然后使用偏移量作为列表项ID。 但是删除/排序总是一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM