Многопоточность или нет - PullRequest
       12

Многопоточность или нет

1 голос
/ 13 апреля 2009

Я создаю консольное приложение для Windows, которое будет построчно читать текстовый файл и извлекать данные из строки фиксированной длины. Приложение на данный момент написано как приложение Windows, но позже будет преобразовано в приложение консоли Windows. Я заметил, что приложению требуется некоторое время, чтобы прочитать текст, вставить его в базу данных и экспортировать из базы данных.

Поможет ли это ускорить процесс, если я использую несколько потоков? Я думаю, что один поток для чтения данных, а другой поток для вставки данных в базу данных.

есть предложения?

изменить: приложение будет сделано в VB.net

Ответы [ 8 ]

4 голосов
/ 13 апреля 2009

Я предполагаю, что это база данных SQL.

Вероятно, ваша проблема в том, что вы делаете по одному предмету за раз. SQL ненавидит это. Базы данных SQL и SQL работают с наборами элементов.

Итак, откройте транзакцию, прочитайте и вставьте 1000 элементов. Сохраните эти элементы на случай, если транзакция по какой-либо причине не удалась, чтобы вы могли повторить попытку.

Мне удалось ускорить некоторые сценарии Perl, выполняющие работу, которая звучит похоже на ваше описание более чем в 20 раз с помощью этой техники.

Я не знаю библиотеку Microsoft, которую вы используете, но вот пример на Perl с использованием DBI. Части, которые заставляют это работать, являются AutoCommit => 0 и $ dbh-> commit.

#!/usr/bin/perl

use strict;
use DBI;

my $dbname = 'urls';
my $user = 'postgres';
my $pass = '';

my $dbh = DBI->connect(
    "DBI:Pg:dbname=$dbname",
    $user,
    $pass,
    { 'RaiseError' => 1, AutoCommit => 0 }
);

my $insert = $dbh->prepare('
    INSERT INTO todo (domain, path)
    VALUES (?, ?)
');

my $count = 0;
while(<>) {
    if( $count++ % 1000 == 0) {
        $dbh->commit;
    }
    chomp;
    my ($one, $two) = split;
    $insert->execute($one, $two);
}
$dbh->commit;
$dbh->disconnect;
1 голос
/ 13 апреля 2009

Добавление данных в базу данных является трудоемкой операцией. Попробуйте собирать элементы партиями (скажем, 1000) и отправлять эти партии в базу данных, а не отправлять элементы по одному Это должно улучшить вашу производительность. Многопоточность излишня для этого типа приложений.

1 голос
/ 13 апреля 2009

С несколькими потоками вы можете получить некоторое перекрытие - один поток читает с диска, а другой поток выполняет вставку базы данных. Я предполагаю, что вы, вероятно, не увидите такого улучшения - если вы не читаете очень большие файлы, большая часть вашего времени, вероятно, тратится на вставку в базу данных, а время на дисковый ввод-вывод - просто шум.

1 голос
/ 13 апреля 2009

Невозможно сказать вообще - единственный способ выяснить это - создать приложение и проверить производительность. Узким местом, скорее всего, является вставка в БД, но то, ускорит ли многопоточность ускорение, зависит от множества факторов:

  • Ваше приложение и сервер БД работают на одной и той же машине?
  • они используют один и тот же диск?
  • Может ли одна вставка вызвать конфликт с другой?

Вы поняли идею. Сказав это, я написал серверы в финансовой индустрии, где многопоточность доступа к БД имела огромное значение. Но речь шла о гигантском корпоративном сервере Sun, который имел резервные операции ввода-вывода для базы данных, поэтому переполнение его запросами многопоточного приложения имело смысл.

0 голосов
/ 13 апреля 2009

несколько потоков не всегда улучшают производительность. Если действия действительно могут выполняться параллельно, то работают только основные многопоточности. Если при чтении данных выполняется много операций ввода-вывода, стоит попробовать. Лучший способ - создать прототип и проверить.

0 голосов
/ 13 апреля 2009

Вы не будете знать, поможет ли многопоточность, до тех пор, пока вы не создадите приложение, но кажется, что вы действительно просто хотите повысить производительность. Прежде чем что-то делать, нужно измерить производительность приложения. Возможно, есть какой-то неэффективный код, поэтому используйте профилировщик для выявления узких мест.

0 голосов
/ 13 апреля 2009

Что вы используете для создания приложения для Windows? Если вы используете .Net, используйте пул потоков. Есть хорошая библиотека под названием Power threading, разработанная Джеффом Рихтером. Скачать

Также поймите, как работают потоки в ОС Windows. Добавление нескольких потоков иногда может не помочь, и я часто не поощряю это.

0 голосов
/ 13 апреля 2009

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

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