Удаление дублей их двух таблиц за одну секунду

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by logos logos, 3 May 2018.

  1. logos logos

    logos logos New Member

    Joined:
    3 May 2018
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте. Перелазил все форумы, наткнулся на ваш. Надеюсь тут найти решение.
    Есть таблица 1 миллион строк. В ней 3 столбца Имя-Номер-Город. Каждый день парсю по 100к новых номеров. Как мне осуществить проверку новой таблицы с уже существующей базой на дубликаты. Может есть уже готовый софт или кто в состоянии написать С# код. Моих знаний хватило только зациклить последовательую проверку строк, как вы уже понимаете это сильно грузит ЦП и занимает много времени.
     
  2. logos logos

    logos logos New Member

    Joined:
    3 May 2018
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Я вот как пытался решить эту задачку:
    Этим кодом я в обеих таблицах вытащил по колонке с номерами
    Code:
    IZennoTable table = project.Tables["на проверку"]; //указываем таблицу
    IZennoList list =  project.Lists["новые"]; //указываем список
    string column = "B"; //указываем наименование столбца
    string cell;
    
    //Перегоняем столбец в список
    for (int i=0;i<table.RowCount; i++){
         cell = table.GetCell(column, i);//
         list.Add(cell);
    }
    Этим кодом я почистил номера от дублей
    Code:
    lock(SyncObjects.ListSyncer){
        string[] first = File.ReadAllLines(@"D:\база.txt");
        string[] second = File.ReadAllLines(@"D:\новые.txt");
        string[] third = second.AsParallel().Except(first.AsParallel()).ToArray();
        File.WriteAllLines(@"D:\новые.txt", third);
    }
    Этим я искал номер строки с с телефоном, чтобы потом по номеру строки вытянуть соседни ячейки(имя, адрес). Ну и дальше подставлял в табличку по строчно, естественно зациклив это дело. Именно этот участок сильно грузит ЦП, если делать больше чем в 15 потоков, ну и занимает ооочень много времени. Можно ли как-то применить AsParallel сюда. Ну или вообще я не правильным путем пошел, сложная для меня задачка.
    Code:
    // берем из переменной текст, который надо искать
    var textContains = project.Variables["phone"].Value;
    // получаем таблицу, в которой будем искать
    var sourceTable = project.Tables["на проверку"];
    // ищем в каждой строчке в таблице
    lock(SyncObjects.TableSyncer)
    {
    for(int i=0; i < sourceTable.RowCount; i++)
    {
    // читаем строку из таблицы (это будет массив ячеек)
    var cells = sourceTable.GetRow(i).ToArray();
    // пройдем в цикле по всем ячейкам
    for (int j=0; j < cells.Length; j++)
    {
    // проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes"
    if (cells[j].Contains(textContains))
    return i;
    }
    }
    }
    // если ничего не нашли возвращаем "no"
    return "54321";
     
  3. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    810
    Likes Received:
    414
    Reputations:
    62
    1) где хранишь все данные? не грузи их все в память. это ни к чему. загоняй все данные в БД. что бы проще - MS SQL.
    2) через ADO или еще лучше EF просто чекни на .Any() или .FirstOrDefault()
     
    _________________________
  4. SooLFaa

    SooLFaa Members of Antichat

    Joined:
    17 Mar 2014
    Messages:
    530
    Likes Received:
    499
    Reputations:
    154
    Делать это на уровне прикладухи идиотизм:

    2 варианта)
    Code:
    SELECT DISTINCT *
    FROM NewTable N LEFT JOIN OldTable O ON N.Number = O.Number
    WHERE O.NUMBER = NULL
    
    
    SELECT DISTINCT Fio, Number, City
    FROM NewTable
    WHERE Number NOT IN (
        SELECT Number
        FROM OldTable)
     
    _________________________
    panic.ker likes this.