Лучший код для генерации 1 000 000 файлов из базы данных - PullRequest
2 голосов
/ 10 июля 2009

Используя C #, я хочу сгенерировать 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();

Ответы [ 4 ]

3 голосов
/ 10 июля 2009

Поскольку ваши операции связаны с вводом-выводом, а не с процессором, лучший способ состоит в том, чтобы иметь 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 является то, что вы можете создать больше потоков, чем хотите, так как ваши потоки будут блокироваться во время ввода-вывода в большинстве случаев, пул потоков будет создавать новые потоки для обслуживания ваших запросов.

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

0 голосов
/ 10 июля 2009

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

0 голосов
/ 10 июля 2009

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

0 голосов
/ 10 июля 2009

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

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