массовая вставка из CSV в БД с использованием Linq для SQL - PullRequest
1 голос
/ 07 мая 2011

Я реализовал приложение, которое берет данные из CSV-файла и вставляет в Sql DB, я использую Linq для SQL.Также у меня есть требование пропустить те записи, которые имеют некоторую проверку, чтобы добиться этого, я использовал цикл и внутри цикла, вызывая submitchnages ().

проблема: это приложение работает с меньшим количеством записей (<100), но на самом деле не получит CSV-файл с более чем 3 - 4 лаками записи.Я просто запустил свое приложение с этими большими файлами, в результате приложение заняло много времени (5-6 часов).</p>

Пожалуйста, предложите лучший подход.

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

Linq-to-SQL отлично подходит для извлечения данных из базы данных или для проверки и небольшого количества вставок / обновлений одновременно. Но то, что вы делаете (ETL), звучит так, как будто вам нужно заглянуть в объект SqlBulkCopy. Продолжайте и используйте ваши объекты L2S для проверки, но затем вместо того, чтобы отправлять изменения, просто отобразите объекты в старый добрый ADO.NET DataTable и каждую 1000 записей или около того массово вставляйте их.

1 голос
/ 07 мая 2011

Если вам нужно выполнить вставку с помощью Linq2Sql, вы можете захотеть сделать прерывистые коммиты.Как то так -

    public void LoadLargeDataUsingLinqToSql(string pathToCSV){
        DataTable dt = LoadMyCSVToDataTable(pathToCSV);
        int myPerformanceCounter = 0;
        foreach(DataRow dr in dt.Rows()){
            MyLinqClass m = ConvertDRToMyLinqClass(dr);
            if(m.IsValidAndReadyToBeSaved()){
                MyDataContext.MyLinqClassRef.InsertOnSubmit(m);
                myPerformanceCounter++;
            }

            if(myPerformaceCounter>25000){
                //Commit to clear cache.
                MyDataContext.SubmitChanges();
                myPerformanceCounter=0;
            }
        }
        //Commit leftovers
        MyDataContext.SubmitChanges();
    }
1 голос
/ 07 мая 2011

Если производительность является большой проблемой, LINQ to SQL может не быть инструментом для этой работы.Однако, прежде чем выкинуть LINQ to SQL за пределы своего решения, вы можете подумать о следующем:

  • Попробуйте создать новый DataContext после определенного количества записей.DataContext кэширует все сущности, поэтому отправляйте и извлекайте из базы данных, что приведет к значительному размеру памяти и, в конечном итоге ... к нехватке памяти.
  • Используйте SQL Profiler, чтобы увидеть, какие запросы LINQ to SQLотправляет в базу данных.Возможно, LINQ to SQL также запрашивает базу данных для каждой создаваемой вами сущности.
  • Попробуйте настроить базу данных на вставках.Это может быть сложно, но вы можете попробовать записать эти записи в промежуточную таблицу (с меньшим количеством зависимостей) и использовать хранимую процедуру для перемещения данных в конечный пункт назначения.

Массовая вставка - это нечтоРМ не очень хороши, поэтому вам может понадобиться другой подход.

...