筛选每15分钟刷新一次的“大型”数据集的最有效方法

时间:2019-04-12 19:38:59

标签: c# mysql datatable .net-core

我大约有200个Json数据集,每个包含〜100.000行。 构造“主要”数据集(其中包含所有子集):名称,数据集。 “子”-数据集的结构都相同:ID,名称,值。

此外,我对“大”数据集还很陌生,因此从来没有遇到过“复杂”的东西。

数据集中的ID不是唯一的,我只是在寻找每个数据集中每个ID的最小值。

因此,“子”数据集可能有约100.000行,但可以按照ID,名称,LowestValue的样式减少为约8.000行

一个例子是:

{(1,"AAA",10),(1,"AAA",4),(1,"AAA",15),(5,"CCC",28),(5,"CCC",20)}

可以简化为:

{(1,"AAA",4),(5,"CCC",20)}

由于每隔15分钟更改一次数据集,因此我必须“更新”最低值的“本地”列表。 (此更新可以包含更少或更多的唯一ID,因此,如果我只更新值,则可能会保留应该删除的ID,因此我必须“清除”我的本地列表)

我想完成一个可重复的任务(在使用while(true)的任务中运行,或者每15分钟调用一次),以对数据集进行排序。此数据需要通过一个函数来访问,该函数可以检查“什么是数据集Nr。10中XX的最低值”(此处不需要此函数,我的问题纯粹是关于如何正确选择有效地将我的数据排序并存储在本地变量或本地sql数据库中(或者如果有更好的东西))

到目前为止,我有两种方法,成功的方法各不相同:


缓慢而愚蠢的方式(?): 本质上,我所做的是制作一个BIG列表,并开始遍历每个Set,并检查a)值是否已在列表中,以及b)该值是否大于我当前检查的值。

这不仅非常慢,而且我也从未真正删除/创建一个临时列表并将其合并。由于其极低的速度,我几乎停止了这种方法。

List<(int DataSetNumber, long ID, string Name, long Value)> My_Data= new List<(int DataSetNumber, long ID, string Name, long Value)>();

foreach (var Current_Dataset in All_Datasets)
{
    foreach (var CurrentSet in Dataset)
    {
    var TempItem = My_Data.FindIndex(x => x.DataSetNumber == Current_Dataset.Number &&  x.ID== CurrentSet.ID>);
    if (TempItem >= 0)
    {
       if(My_Data[TempItem].Value > CurrentSet.Value)
             My_Data[TempItem] = (CurrentSet.DataSetNumber, CurrentSet.ID, CurrentSet.Name, CurrentSet.Value);
    }
    else
    {
        My_Data.Add((CurrentSet.DataSetNumber, CurrentSet.ID, CurrentSet.Name, CurrentSet.Value));
    }

    }
}

SQL方式 因为我已经有一个本地数据库,用于存储其他数据,所以我想到了“为什么不向列表中添加内容”。 我已经创建了200个表并遍历本地数据,并将我的“精简”数据添加到所述表中(每个数据集都有自己的表)。

我的连接字符串:

string conn = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = DATABASE.mdf; Integrated Security = True";

我首先创建了一个临时列表:

List<(long ID, string Name, long Value)> Temp_List = new List<(long ID, string Name, long Value)>();

将我的数据排序到其中,然后将其上传到表中:

                    foreach (var (ID, Name, Value) in Temp_List)
                    {

                        string query = @"INSERT INTO " + "\"" + DataSet.ID + "\" (Id, Name, Value)";
                        query += " Values (@id, @name, @value)";
                        SqlCommand InsertAuction = new SqlCommand(query, sql);
                        InsertAuction.Parameters.AddWithValue("@id", ID.ToString());
                        InsertAuction.Parameters.AddWithValue("@name", Name);
                        InsertAuction.Parameters.AddWithValue("@value", Value.ToString());
                        InsertAuction.ExecuteNonQuery();
                    }

我现在遇到了一个问题:

  1. “ REPLACE”命令不起作用/ MS SQL中似乎存在
  2. 在创建临时表时,我也无法截断应该替换的当前表
  3. 我仍然不知道这是否是最有效的方法。

所以我的问题是:处理这种数据的推荐方法是什么?我应该只废弃两个想法并以不同的方式解决它吗?是在创建临时表,删除目标表,然后将我的临时表迁移到其中吗?

0 个答案:

没有答案