C# - 大型集合存储

Dan*_*Dan 13 .net c# sql database

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

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

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

我还想过存储一个List或者HashSet在本地内存中进行比较和检索,但它不会解决,因为我无法在内存中存储数十亿条记录(对象).

请告诉我应该为我的情况做些什么.

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

Mub*_*har 3

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

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

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