C# - 大型集合存储

标签 c# sql .net database

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

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

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

我也想过在本地内存中存储一​​个ListHashSet来比较和检索,但是这行不通,我将无法在内存中存储数十亿条记录(对象)。

请就我的情况提出建议。

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

最佳答案

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

我肯定会选择数据库,因为这是以最佳方式查询和存储数据的最著名方式。你没有提到你的应用程序到底做了什么,所以我只能给你关于在这种情况下我会怎么做的一般意见;

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

关于C# - 大型集合存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27394336/

相关文章:

c# - 变量如何寻址RAM?

c# - 有没有办法内联元组解构以避免不必要的分配?

c# - foreach 循环似乎很慢

mysql - 是否可以分解此 SQL 联合语句?

sql - Flyway迁移不适用于gradle

php - SQL删除重复行在字段中找到相同的文本

c# - 在 C# 中部分下载和序列化大文件?

c# - 在 Javascript 中绑定(bind) Radscheduler

c# - 未使用 order by 时,Linq to objects join default order 是否指定?

c++ - 在 .NET 中捕获非托管 dll 异常