2009-04-15 12 views
0

J'ai deux applications (serveur et client), qui utilise TQuery connecté à TClientDataSet via TDCOMConnection, et dans certains cas clientdataset ouvre environ 300000 enregistrements et que l'application lève l'exception "Limite de ressource de table temporaire".Limite de ressources table temporaire

Est-il possible de résoudre ce problème? (Sauf « ne pas ouvrir cette énorme jeu de données »?)

mise à jour: oups je suis désolé il y a 300K dossiers, pas 3 millions ..

Répondre

2

Vous avez déjà la réponse. N'ouvrez pas un tel jeu de données dans un ClientDataSet (CDS). Trois millions de lignes dans un CDS représentent une énorme charge de mémoire (en fonction de la taille de chaque ligne, il peut être gigantesque). L'objectif général de l'utilisation d'un CDS est de travailler rapidement avec de petits ensembles de données pouvant être manipulés en mémoire. Ajoutant que beaucoup de lignes est ridicule; Utilisez plutôt un jeu de données réel, ou remodelez les choses pour ne pas avoir à récupérer autant de lignes à la fois.

+0

erreur pas dans TClientDataSet - il est bug BDE, il est donc TQuery, et il y a 300K dossiers. –

1

plus de 3 millions d'enregistrements est beaucoup trop à gérer à la fois. Je suppose que vous effectuez une exportation ou quelque chose comme ça qui nécessite que beaucoup de dossiers soient envoyés par le câble. Une méthode que vous pourriez utiliser pour réduire ce problème serait que le niveau intermédiaire génère un fichier d'exportation, puis fournisse ce fichier au client (de préférence compresser d'abord en utilisant ZLIB ou quelque chose de similaire). Si vous rapportez des données au client à des fins de visualisation, pensez à n'envoyer que des informations récapitulatives, puis à permettre au client de creuser une partie des données à la fois. Les utilisateurs vous remercieront parce que votre performance augmentera et ils n'auront pas à fouiller dans les dossiers qu'ils ne regardent pas.

EDIT

Même 300.000 dossiers est trop difficile à gérer à la fois. Si vous aviez autant de penny, seriez-vous capable de les porter tous? Mais si vous l'avez fait en plus grandes dénominations, vous pourriez. Si vous envoyez des données au client pour un rapport, alors je suggère fortement une méthode de résumé ... donnez-leur la grande image et laissez-les forer lentement dans les données. envoyez des données groupées et laissez-les s'ouvrir lentement.

S'il s'agit d'un écran de résultats de recherche, définissez une limite du nombre d'enregistrements à renvoyer +1. Par exemple, pour afficher 100 enregistrements, définissez la limite sur 101. Toujours afficher 100, le dernier enregistrement signifie il y avait plus de 100 enregistrements de sorte que le client doit ajuster ses critères de recherche pour retourner un plus petit sous-ensemble.

3

L'erreur peut provenir du TQuery plutôt que du TClientDataSet. Lors de l'utilisation d'un TQuery, il crée une table temporaire et il se peut que cette limite soit atteinte. Cependant, en disant cela, charger 3 000 000 d'enregistrements dans un TClientDataSet est une mauvaise idée car il essayera de charger chaque enregistrement en mémoire - ce qui peut être possible s'ils ne sont que de quelques octets chacun mais il va probablement encore tuer votre machine (évidemment à 1kb chacun, vous aurez besoin de 3 Go de RAM minimum).

Vous devriez essayer de diviser vos données en plus petits morceaux. Si c'est l'échec de TQuery cela signifie ajuster le SQL (moins de champs/moins d'enregistrements) ou passer à une meilleure base de données (le BDE devient un peu fatigué après tout).

+0

Yep c'est tquery, mais theres 300K dossiers, malheureusement je ne peux pas passer de BDE (c'est vieux et grand projet) et je ne peux pas passer à "mieux" la base de données (il est oracle :)) –

0

La limite de ressource de table temporaire n'est pas une limite pour une seule requête. c'est la limite pour toutes les requêtes ouvertes ensemble. il peut donc être une solution pour vous de fermer toutes les autres requêtes à ce moment-là.

Si vous ne pouvez pas utiliser la connexion ADO, vous pouvez également concevoir un mécanisme de recherche pour l'interrogation des données page par page.

BONNE CHANCE

Questions connexes