C# - 大型集合存储

时间:2014-12-10 06:10:31

标签: c# sql .net database

我目前面临着一个令人头疼的问题,我正在处理一个大型数据集(当我说大的时候,我的意思是数十亿行数据)而且我遇到了速度和可扩展性。

我可以在数据库中存储数十亿行数据,但我的应用程序需要不断检查数据集中是否存在新的数据行,如果没有,请插入,否则,检索它。

如果我要使用数据库解决方案,我估计每次调用数据库以检索一行数据为10ms(乐观估计),我需要检索我在我的应用程序中处理的每个文件的大约800k记录,这意味着要处理的每个文件(10ms x 800k = 2.22 hours)。考虑到当数据库增长到数十亿和数十亿行时,从数据库中检索一行数据所需的时间将会增加,这个时间跨度太长,无法分析和处理1个文件。

我还想过在本地内存中存储一​​个ListHashSet来进行比较和检索,但由于我无法存储数十亿条记录,因此无法解决问题(记忆中的对象。

请就我的情况应该做些什么。

编辑:哦,是的,我忘了声明我已经实现了半缓存,一旦检索到一条记录,它就会缓存在内存中,所以如果需要再次检索相同的记录,它将是从内存中检索,但我面临同样的问题,我将达到内存不再适合任何更多缓存数据的时间点。

1 个答案:

答案 0 :(得分:2)

理想情况下,如果您正在播放大量数据,那么您必须确保在处理数据时不会耗尽资源。但是,您只需要找到一种合理的方法来提高资源的利用率。

我肯定会使用数据库,因为这是以最佳方式查询和存储数据的最着名方法。你没有提到你的应用程序究竟是做什么的,所以我可以就你在这种情况下如何做而给出一般意见;

  1. 如果数据库的数据大小真的很大,就像你说的数十亿,如果为了分析或报告目的而读取数据,你最好找到像立方体等数据挖掘技术。这将有助于你以某种方式构建数据减少查询时间。
  2. 如果上面没有选项可以找到一种水平或垂直分区数据的方法,那么它还取决于您实际检索数据的方式以及如何将它们真正组合在一起。
  3. 找到一种查询一组行的方法(例如,在(1,2,3,4,...,100)中的pk,而不是如前所述查询每一行,分组可能会增加查询响应指数方式。
  4. 最好在数据本身中找到主键,以便您的数据按物理顺序按主键排序,即使插入主键也会知道主键。但是,如果您不使用主键查询,那么最好放置合理的索引以增加查询响应时间。
  5. 保持数据库连接在您的应用程序生命周期内保持打开状态,并仅在删除时重新连接。如果需要多个数据库连接,请使用连接池。