2009-04-13 6 views
1

Je crée une application de console Windows qui lira le fichier texte ligne par ligne et extraira les données de la chaîne de données de longueur fixe. L'application est écrite en tant qu'application Windows pour l'instant mais sera convertie en application de console Windows plus tard. J'ai remarqué qu'il faut du temps pour que l'application s'exécute en lisant le texte, en l'insérant dans la base de données et en exportant hors de la base de données.Pour plusieurs threads ou pas

Cela aiderait-il à accélérer le processus si j'utilise plusieurs threads? Je pense à un thread pour lire les données et un autre thread à insérer les données dans la base de données.

une suggestion?

modifier: l'application va être fait dans VB.net

Répondre

1

Il est impossible de dire en général - la seule façon de le savoir est de construire l'application et tester les performances. Le goulot d'étranglement est susceptible d'être l'insert de DB, mais si le multi-threading va accélérer thibngs jusqu'à depennds sur une foule de facteurs:

  • sont votre application et le serveur db fonctionnant sur thge même machine? Utilisent-ils le même disque?
  • peut-on insérer provoquer un conflit avec un autre?

Vous avez l'idée. Cela dit, j'ai écrit des serveurs dans le secteur de la finance où le multithreading de l'accès à la base de données a fait une énorme différence. Mais ceux-ci parlaient à un gigantesque serveur d'entreprise de Sun qui avait des E/S de base de données à épargner, l'inondant ainsi avec des demandes d'une application multi-threadée logique.

1

Avec plusieurs threads, vous pouvez obtenir un certain chevauchement - un thread lit à partir du disque pendant qu'un autre thread effectue une insertion de base de données. J'imagine que vous ne verrez probablement pas grand-chose d'amélioration - à moins de lire des fichiers très volumineux, la plus grande partie de votre temps est probablement consacrée à l'insertion dans la base de données.

0

Vous n'en tirerez probablement pas grand-chose, car la tâche que vous décrivez ici est plutôt séquentielle.

-1

Qu'est-ce que vous utilisez pour construire l'application Windows? Si vous utilisez .Net, utilisez le pool de threads. Il y a une belle bibliothèque appelée Threading Power développée par Jeff Richter. Download

De même, comprenez comment les threads fonctionnent dans Windows OS. L'ajout de plusieurs threads peut parfois ne pas aider et je ne l'encourage pas souvent.

0

Vous ne saurez pas si le multithreading aidera jusqu'à ce que vous construisiez l'application, mais il semble que vous vouliez simplement de meilleures performances. Avant de faire quoi que ce soit, vous devez mesurer la performance de l'application. Il existe peut-être un code inefficace, utilisez donc un profileur pour identifier les goulots d'étranglement.

0

Plusieurs threads n'améliorent pas toujours les performances. Si les activités peuvent vraiment être exécutées en parallèle, seul le multithreading basique fonctionne. Si de nombreuses opérations d'E/S sont effectuées dans la lecture des données, cela vaut la peine d'essayer. Le meilleur moyen est de prototyper et de vérifier. Je vais supposer qu'il s'agit d'une base de données SQL.

4

Votre problème est susceptible d'être que vous faites un élément à la fois. SQL déteste ça. Les bases de données SQL et SQL fonctionnent sur définit des articles.Donc, ouvrez une transaction, lisez et insérez 1 000 éléments. Enregistrez ces éléments au cas où la validation de la transaction échoue pour une raison quelconque afin que vous puissiez réessayer.

J'ai réussi à accélérer certains scripts Perl en faisant un travail qui ressemble à votre description de plus de 20x avec cette technique.

Je ne connais pas la bibliothèque Microsoft que vous utilisez, mais voici un exemple de Perl utilisant DBI. Les parties qui le font fonctionner sont AutoCommit => 0 et $ 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; 
+0

Pouvez-vous me donner plus de détails sur la façon de faire avec un ensemble d'articles? Un tutoriel ou un exemple sera génial. BTW, j'utilise la bibliothèque Microsoft Enterprise pour insérer les données. Remercier. – Jack

1

La transmission de données à la base de données est une opération qui nécessite beaucoup de temps. Essayez de collecter des éléments par lots (disons 1000) et soumettez ces lots à la base de données plutôt que de soumettre les éléments un par un. Cela devrait améliorer votre performance. Le multithreading est excessif pour ce type d'application.

Questions connexes