【发布时间】:2011-09-14 19:11:17
【问题描述】:
我需要对实现为 IList 的巨大时间序列按时间顺序执行操作。数据最终存储到数据库中,但是向数据库提交数千万次查询是没有意义的。
当前内存中的 IList 在尝试存储超过 800 万个(小)对象时会触发 OutOfMemory 异常,但我需要处理数千万个。
经过一些研究,看起来最好的方法是将数据存储在磁盘上并通过 IList 包装器访问它。
Memory-mapped files(在 .NET 4.0 中引入)似乎是正确的接口,但我想知道编写一个应该实现 IList(以便于访问)并在内部处理内存映射文件的类的最佳方法是什么.
我也很想知道您是否知道其他方式!例如,我想到了一个使用 db4o 数据的 IList 包装器(someone mentionned here 使用内存映射文件作为 IoAdapterFile,尽管使用 db4o 与直接处理内存映射文件相比可能会增加性能成本)。
我在 2009 年遇到过 this question 的提问,但没有给出有用的答案或严肃的想法。
【问题讨论】:
-
您执行的操作是顺序的吗?还是您一次对全部数据进行操作?
-
访问应该是顺序的(遍历集合以执行更新),并且我还需要能够在远端删除/删除对象。
-
数据库是完成这项工作的正确工具。批量更新数据,避免数据库调用过多。您可能还对 map-reduce 样式处理感兴趣,以加快速度。
标签: c# .net memory-management collections memory-mapped-files