【问题标题】:In memory alternative to datasets在内存中替代数据集
【发布时间】:2011-12-14 23:53:16
【问题描述】:

我正在将一个复杂的过程从 SQL 转移到一个 .NET 应用程序。我有点采取蛮力的方法,只从 SQL 中提取所需的数据,然后存储在数据表中。使用带步进的管道模式,我分解了可以并行完成的进程(不依赖于其他进程,也不处理相同的数据位)。

一切都很好,但我想知道是否有内存中的 sql 解决方案比 DataSet/DataTable 结构执行得更好。我们一次讨论 50k 行,最多支持 1m 行数据(读取 5b 行)。 1 行(包含所有支持的数据行)的行大小可能约为 1K 平均(由于大字符串)。

我的问题专门针对 DataSet 的性能、内存开销和持久性。我需要将每个阶段的数据序列化到磁盘以进行恢复。

将行映射到强类型模型会更好吗?我不需要数据集的任何关系或其他好处;我使用并行处理替换了大部分搜索功能。

数据仅使用原始类型,没有 blob、流、地理等。

【问题讨论】:

  • 至于将其转换为强类型模型,我想说这取决于您所代表的数据。另外,你试图对内存中的数据做什么?了解这一点可能有助于我自己和其他人确定针对这种情况的最佳方法/最佳建议。
  • 大约需要发生 100 个不同的过程。检查重复记录、数据计算和聚合、更新、删除等。生成的最终数据集被推送回 SQL。某些进程需要加入和组之类的功能。

标签: c# .net-4.0 dataset nosql data-processing


【解决方案1】:

对于本地 SQL 操作,请查看 SQLite。我不记得它是否可以专门在内存中运行,但是如果关闭磁盘缓存和事务日志,它可能会非常接近。

多年前,Steve Shaunessey 在 Borland 开发了一个快速的内存 SQL 引擎。我不知道它是否曾经被产品化过。浏览 Embarcadero.com 网站,看看他的作品是否有任何残留物幸存下来。

我注意到 aidaim.com 宣传了一个内存中的 SQL 引擎。没有经验,仅供参考。

还可以考虑使用 LINQ 进行内存查询操作。如果你注意你在做什么,LINQ 的查询组合和延迟执行可以很好地处理大数据,IMO。而且,不需要 SQL 解析器。

【讨论】:

  • +1 - 是的,它可以完全在内存中运行。见sqlite.org/inmemorydb.html
  • 啊哈,灰色的小细胞正在全力以赴,以换换气。自从使用 SQLite 构建 Google Gears 后,我就没有使用过 SQLite,但模糊地记得内存中是一种选择。谢谢!
  • +1 感谢@dthorpe,我在发这篇文章之前下载了 SQLite,但还没有开始使用它。
  • 那是 BlackFishSQL(不,NDataStore,不,JDataStore)。它非常有前途,可以统治 .NET Mobile 世界。但自 XE blog.marcocantu.com/blog/blackfish_sql_replacement.html 以来,它并没有很好地营销并从 Delphi/C++Builder/RADStudio SKU 中删除,尽管仍在 Embarcadero 网站上,我猜它已经死了 embarcadero.com/products/blackfish-sql
猜你喜欢
  • 2011-05-16
  • 2016-08-11
  • 2023-03-19
  • 2011-04-27
  • 2011-05-16
  • 1970-01-01
  • 2014-05-04
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多