У меня есть примерно 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();
}
Я столкнулся с проблемой, что:
- команда «REPLACE» не работает / не существует в MS SQL
- При созданииTemp Table Я также не могу TRUNCATE моей текущей таблицы, которая должна быть заменена
- Я до сих пор не знаю, если это даже самый эффективный способ.
Так что мой вопросявляется: Каков рекомендуемый способ обработки таких данных?Должен ли я просто отказаться от обеих идей и решить их по-разному?Создает ли временная таблица, удаляет целевую таблицу и затем переносит в нее мою временную таблицу?