Самый эффективный способ сортировки «больших» наборов данных, которые обновляются каждые 15 минут - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть примерно 200 наборов данных Json, которые содержат ~ 100.000 строк каждый.Составляется «Основной» набор данных (который содержит все подмножества): Имя, Набор данных.Наборы данных «Sub» структурированы одинаково: ID, имя, значение.

Кроме того, я очень новичок с «большими» наборами данных и, таким образом, никогда не сталкивался с чем-то, даже в некотором роде «сложным».*

Идентификаторы в наборе данных не являются уникальными, и я ищу только самое низкое значение каждого идентификатора для каждого набора данных.

Так что набор данных "Sub" может иметь ~ 100.000 строк, но можетможет быть уменьшено до ~ 8.000 строк в стиле: ID, Name, LowestValue

Примером может быть:

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

, который может быть уменьшен до:

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

Из-за того, что наборы данных меняются каждые ~ 15 минут, мне приходится «обновлять» мой «локальный» список самых низких значений.(Это обновление может иметь меньше или больше уникальных идентификаторов, поэтому я должен «очистить» свой локальный список, если я просто обновлю значения, я мог бы сохранить идентификатор, который должен был быть удален)

Я быхотел бы получить повторяющуюся задачу (либо запустить задачу с параметром while (true), либо вызываться каждые 15 минут), который сортирует наборы данных.Эти данные должны быть доступны с помощью функции, с помощью которой я могу проверить «Какое самое низкое значение ХХ в наборе данных № 10» (Эта функция здесь не нужна, мой вопрос состоит только в том, чтобы подтолкнуть в правильном направлении того, какэффективно сортировать и хранить мои данные либо в локальной переменной, либо в локальной базе данных sql (или, если есть что-то лучше))

Пока у меня есть два подхода, отличающихся успехом:


Медленный и тупой путь (?): По сути, я сделал большой список и начал цикл по каждому набору и проверил, есть ли а) значение уже в списке и б) еслизначение больше того, которое я сейчас проверяю.

Мало того, что это было безумно медленно, но я также фактически никогда не удалял / не создавал временный список и не сливал его.Я в значительной степени остановил этот подход из-за его безумно низкой скорости.

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. При созданииTemp Table Я также не могу TRUNCATE моей текущей таблицы, которая должна быть заменена
  3. Я до сих пор не знаю, если это даже самый эффективный способ.

Так что мой вопросявляется: Каков рекомендуемый способ обработки таких данных?Должен ли я просто отказаться от обеих идей и решить их по-разному?Создает ли временная таблица, удаляет целевую таблицу и затем переносит в нее мою временную таблицу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...