2010-07-23 6 views
1

J'écris une application dans vb.net 2005. L'application lit une feuille de calcul dans un DataSet avec ADO.NET et utilise une colonne de cette table pour remplir un ListBox. Lorsqu'un élément ListBox est sélectionné, l'utilisateur recevra des informations détaillées sur l'enregistrement sélectionné.Problèmes liés à l'énorme surcharge du processeur

Une partie de cette information ne se trouve pas dans le DataSet. Je dois comparer une colonne de la feuille de calcul avec plusieurs sources de données externes pour déterminer la nature de l'enregistrement en question. Voici où j'ai mon problème.

Cette comparaison doit effectuer une recherche sur des lignes de 9,5 m dans une table SQL à un moment donné. J'ai vérifié et il n'y a aucun moyen de "rétrécir" la requête car je ne recherche déjà que des données absolument essentielles.

Ce qui se passe, c'est que l'application ne fait jamais rien de visible. L'utilisation du processeur peut atteindre 100%, quel que soit son état d'avancement, et les performances du système deviennent presque insupportablement lentes.

Quelqu'un peut-il suggérer une façon dont je peux améliorer cette situation pendant que cette requête massive est en cours d'exécution? EDIT: J'allais à l'origine écrire le contenu des lignes de 9.5m dans la table de la base de données dans un fichier texte que je lirais alors, mais après des lignes de 6.5m, j'ai obtenu une exception OutOfMemoryException.

+0

Pourriez-vous préciser quand exactement l'utilisation du processeur tire jusqu'à 100%, c.-à-d. Que fait votre code pour le provoquer? Le profilage peut aider. – EMP

+0

L'utilisation du processeur monte en flèche lorsque l'application accède à la base de données. Je l'ai défini pour exécuter une requête SQL filtrée par la valeur du champ que je recherche. Si des résultats sont trouvés, un DataSet a rempli ces résultats, sinon, le DataSet reste Nothing. C'est ici que le processeur atteint son maximum. Je l'ai laissé en cours d'exécution une ou deux fois et il finit par lancer une exception OutOfMemoryException. –

Répondre

3

Je suppose que votre processeur pourrait être utilisé pour remplir le DataSet, bien que vous deviez profiler votre application pour le confirmer. Essayez plutôt d'utiliser un DataReader et de stocker les résultats dans un format plus compact en mémoire ou, si vous manquez de mémoire, puis de les écrire dans un fichier au fur et à mesure. Avec l'approche DataReader, vous n'avez jamais besoin de stocker l'intégralité du jeu de résultats en mémoire en même temps.

+0

CORRECT J'ai essayé le DataReader et les résultats sont apparus sur mon formulaire presque instantanément.Une amélioration significative de l'approche DataSet Merci pour le conseil :) –

0
  1. Un index dans la colonne à rechercher?
  2. Un nouveau champ dans la table pour aider à chercher plus rapidement?
+0

1. J'ai besoin de chercher par une colonne spécifique et je le fais. 2. Pouvez-vous élaborer un nouveau champ dans le tableau pour accélérer la recherche? La base de données contient les informations client de la société et je dois passer par quelques approbations avant de pouvoir apporter des modifications aux schémas de la table. Connaissant mon patron, je doute fortement qu'il verra que c'est nécessaire. –

+0

Si la recherche est quelque chose comme Color = 'Rouge' vous pouvez ajouter une colonne entière où vous pouvez insérer, énumérer les valeurs possibles de couleur, ou, dans Oracle, un index bitmap pourrait aider. – onof

+0

'SELECT TelephoneNumber, Prénom FROM Clients OERE TelephoneNumber = '" & CallData.Tables (0) .Rows (i) (2) .ToString & "'" 'est ma sélection, je sélectionne par numéro de téléphone parce que c'est le L'idée est que si le numéro de la feuille de calcul apparaît dans ce tableau, alors l'appel détaillé dans la feuille de calcul n'était pas un appel personnel car l'appel a été fait à un numéro listé sur le client détails –

Questions connexes