Je travaille avec une base de données mysql assez grande (plusieurs millions de lignes) avec une colonne stockant des images BLOB. L'application tente de saisir un sous-ensemble des images et exécute certains algorithmes de traitement sur eux. Le problème que je rencontre est que, en raison de l'assez grand ensemble de données que j'ai, l'ensemble de données que ma requête retourne est trop grand pour stocker en mémoire.Faire face à un grand nombre de résultats SQL
Pour le moment, j'ai changé la requête pour ne pas retourner les images. Pendant l'itération sur le jeu de résultats, j'exécute une autre sélection qui saisit l'image individuelle qui se rapporte à l'enregistrement en cours. Cela fonctionne, mais les dizaines de milliers de requêtes supplémentaires ont entraîné une diminution des performances inacceptable.
Mon idée suivante consiste à limiter la requête d'origine à 10 000 résultats environ, puis de poursuivre l'interrogation sur des intervalles de 10 000 lignes. Cela semble être le compromis entre les deux approches. Je pense qu'il y a probablement une meilleure solution que je ne connais pas. Existe-t-il une autre façon d'avoir seulement des parties d'un ensemble de résultats gigantesque en mémoire à la fois?
Cheers,
Dave McClelland
Peut-être que mes problèmes de mémoire ne sont pas causés par la requête. Je suis revenu à une ancienne version (merci, contrôle de version), et le lecteur de données semble charger seulement la ligne qu'il lit actuellement, comme mentionné par Anthony. Cependant, je me demande s'il ne serait pas plus logique de garder les images sur le système de fichiers local au lieu de les transférer sur le réseau depuis le serveur de base de données (comme mentionné par ProphetBeal ci-dessous). L'inconvénient est qu'il serait stocké dans les deux emplacements (ils doivent rester dans la base de données pour l'utilisation d'autres systèmes), mais l'espace de stockage du système de fichiers n'est pas une préoccupation immédiate. Des commentaires à ce sujet? –
Je donne la réponse à Anthony parce qu'il a souligné que le DataReader n'est pas la raison pour laquelle ma mémoire se remplissait (c'était quelque chose de différent, mais légèrement différent). Je vais probablement utiliser la solution de ProphetBeal de garder les BLOBs sur la machine locale pour éliminer la congestion du réseau, mais pour toute personne traitant avec un ensemble de données à stocker sur la machine locale, un DataReader devrait être une solution efficace. –