2009-07-10 1 views
2

Используя C#, я хочу генерировать 1,000,000 файлов из БД, каждая запись в отдельном файле. Каков наилучший способ сгенерировать эти файлы за минимальное время?Лучший код для генерации 1 000 000 файлов из базы данных

Вот мой код без резьбы:

AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); // to calculate the execution time in case of using threading 
    SqlCommand cmd = new SqlCommand(@"select top 1000000 p1+','+p2+','+p3+','+p4 as line from lines ", con); 

    con.Open(); 
    var rdr = cmd.ExecuteReader(); 
    int i = 0; 
    while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     string filename = String.Format("file{0}.txt", ++i); 
     File.WriteAllText(filename, line); 

    } 
    rdr.Close(); 
    con.Close(); 
+0

Вы используете C# 3.0? – abhilash

+0

Он должен быть из-за ключевого слова var в своем коде. – Kredns

+0

Вы действительно хотите, чтобы все они были в одном каталоге? –

ответ

3

Поскольку ваши операции ввода-вывода связаны и не ЦП, лучший способ иметь 2 потоков, один, который считывает из БД записи и поместить его в очередь, другая читается из очереди и генерирует файлы.

В качестве альтернативы, вы можете использовать пул CLR потоков для этого, что-то вроде

while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     ThreadPool.QueueUserWorkItem (new WaitCallback(writeData), line); 

    } 

и WriteData будет выглядеть

static void writeData(Object line) 
{ 
      string filename = String.Format("file{0}.txt", ++i); 
      File.WriteAllText(filename, line); 
} 

Недостатком использования ThreadPool является вы могли бы в конечном итоге больше потоков чем вы хотите, так как ваши потоки будут блокироваться в IO большую часть времени, пул потоков создаст новые потоки для обслуживания ваших запросов.

Сначала вы можете попробовать пул потоков и измерить производительность, если вы не удовлетворены, вы можете попробовать 2 потока, 1 очередь; известный как проблема производителя/потребителя.

+0

Использование пула потоков генерирует только 2713 файлов и выходит из моего приложения. неожиданное поведение. – Ammroff

0

Вам будет полезно иметь больше потоков; лучший способ определить точное число - это эмпирически, но не ограничивайте себя одним ядром процессора так, как вы могли бы с задачами, связанными с CPU. Самый простой способ - использовать ThreadPool, но система массового обслуживания Producer/Consumer будет более гибкой и настраиваемой.

0

Почему бы не использовать пакет SSIS? Разве это не должно делать такие вещи?

+0

У вас есть статья о пакете SSIS для генерации файлов? – Ammroff

0

This может помочь.

+0

это отлично работает, если ваша база данных - это только SQL Server :) Я надеюсь, что большинство людей используют :) – mfawzymkh

+1

Хотя он не показывал строку подключения, использование SQLCommand предполагает, что он использует SQL в качестве базы данных. Поэтому я предполагаю, что это можно использовать. – danish

+0

Да, я использую SQLserver 2008, и я не могу найти способ генерации каждой записи в один файл с помощью SSIS, Может ли кто-нибудь помочь? – Ammroff