2008-10-28 18 views
0

Je dois choisir un système de gestion de base de données (SGBD) qui utilise le moins de mémoire principale car nous sommes sévèrement limités. Comme un SGBD utilisera de plus en plus de mémoire pour contenir l'index dans la mémoire principale, comment puis-je savoir quel DBMS a la plus petite empreinte mémoire? En ce moment, j'ai juste un programme de surveillance mémoire ouvert pendant que j'effectue une série de requêtes que nous appellerons X. Ensuite, j'exécute le même jeu de requêtes X sur un SGBD différent et je vois combien de mémoire est utilisée dans sa vie et comparez avec les autres empreintes de mémoire.Comment déterminer la quantité de mémoire principale utilisée par une application

Est-ce une manière non-stupide d'aller à ce sujet? Y a-t-il un meilleur moyen?

Merci, JBU

+0

Pourquoi êtes-vous contraint? La mémoire est bon marché! Ou est-ce pour un appareil mobile/embarqué? –

Répondre

0

En fin de compte, ce genre d'optimisation répond probablement à la mauvaise question.

Très probablement les réponses que vous ramasserez par ce genre de tests vont induire en erreur, car le SGBD réagit différemment dans des circonstances « vivantes » que lors de vos tests. De plus, vous vous enfermez dans une architecture particulière. Il est difficile de changer de SGBD, une fois que vous avez écrit du code contre. Vous seriez beaucoup mieux servi de trouver quel SGBD répondra à vos besoins et simplifier votre processus de développement, puis assurez-vous d'optimiser vos requêtes SQL et vos index pour répondre aux besoins de votre application.

+0

heureusement j'utilise JDBC qui est une API standard pour les applications Java utilisant les bases de données –

+0

JDBC est le "tuyau" que vous envoyez des instructions SQL à travers ... Malheureusement, la syntaxe SQL entre les bases de données diffère souvent. –

1

Ce que vous pouvez faire dans l'application est de gérer comment vous allez chercher des données. Si vous récupérez toutes les lignes d'une requête donnée, il peut essayer de créer un Collection dans votre application, ce qui peut consommer de la mémoire très rapidement si vous ne faites pas attention. C'est probablement la cause la plus probable de l'épuisement de la mémoire.

Pour résoudre ce problème, ouvrir un curseur sur une requête et extraire les résultats un par un, jeter les objets de ligne que vous itérer à travers le jeu de résultats. De cette façon, vous ne stockez qu'une seule rangée à la fois et vous pouvez prédire plus facilement la «marque des hautes eaux». Selon le pilote JDBC (c'est-à-dire la marque de la base de données à laquelle vous vous connectez), il peut être difficile de convaincre le pilote JDBC et non de faire un fetchall. Par exemple, certains pilotes récupèrent l'ensemble des résultats pour vous permettre de le faire défiler vers l'arrière ou vers l'avant. Même si JDBC est une interface standard, la configuration pour faire une ligne à la fois au lieu de fetchall peut impliquer des options propriétaires. Du côté serveur de base de données, vous devriez pouvoir gérer la quantité de mémoire allouée au cache d'index et ainsi de suite, mais les éléments spécifiques que vous pouvez configurer sont différents dans chaque marque de base de données. Il n'y a pas de raccourci pour vous éduquer sur la façon de régler chaque serveur.

2

Utilisez simplement SQLite. En un seul processus. Avec C++, de préférence.