【问题标题】:C# - Large collection storageC# - 大型集合存储
【发布时间】:2014-12-10 06:10:30
【问题描述】:

我目前正面临一个令人头疼的问题,我正在处理一个大型数据集(当我说大型时,我指的是数十亿行数据)并且我在速度和可扩展性之间陷入了困境。

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

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

我也想过在本地内存中存储 ListHashSet 以进行比较和检索,但它不会成功,因为我将无法在其中存储数十亿条记录(对象)记忆。

请就我的情况提出建议。

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

【问题讨论】:

  • 有什么方法可以合理地确定检索可能需要哪些行,例如最近的,即实现部分缓存功能?
  • 哦对了,我忘了说我已经实现了半缓存,一旦检索到一条记录,它就会缓存在内存中,所以如果需要再次检索相同的记录,它将改为从内存中检索,但我面临同样的问题,我将到达内存不再适合任何缓存数据的时间点。
  • 使用 HASH 比较您创建的每个文件,将文件与哈希码相关联,因此您需要比较 HASH 而不是 FILE?
  • 数据集与文件的关系如何?不清楚。
  • @KCdod 说我遵循您的建议,并改用哈希,这又回到了我的问题,我应该将它存储在数据库中还是内存中?我想你误解了我的问题。

标签: c# sql .net database


【解决方案1】:

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

我肯定会选择数据库,因为这是以最佳方式查询和存储数据的最知名方式。您没有提到您的应用程序究竟做了什么,所以我只能就在这种情况下我将如何做给您一般性的意见;

  1. 如果您的数据库的数据量真的很大,如您所说的以数十亿计,并且如果您的数据被读取用于分析或报告目的,您最好找到一种数据挖掘技术,如多维数据集等。这将帮助您以某种方式构建数据以减少查询时间。
  2. 如果上述方法无法找到水平或垂直分区数据的方法,那么它还取决于您实际检索数据的方式以及如何将它们真正组合在一起。
  3. 找到一种方法来查询一组行(例如 where pk in (1,2,3,4,...,100),而不是像前面提到的那样每次查询每一行,分组可能会增加查询响应指数方式。
  4. 最好在数据本身中找到一个主键,这样您的数据将按照您的主键物理顺序进行排序,您甚至可以在插入之前知道您的主键。但是,如果您不使用主键进行查询,那么最好放置合理的索引以增加查询响应时间。
  5. 在应用程序的生命周期内保持数据库连接打开,并且只有在断开时才重新连接。如果需要与数据库建立多个连接,则使用连接池。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2011-09-23
    • 2011-11-09
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多