2011-05-12 5 views
2

Je suis en train de mettre en œuvre un algorithme statistique qui nécessite l'accès à un grand ensemble de données pour un test approprié. Large étant 50 000 lignes dans une seule table, MySQL.Algorithme de test sur un grand ensemble de données

Je voudrais utiliser les méthodes RSpec traditionnelles pour tester, mais créer l'ensemble d'échantillons et le charger dans la base de données conduit à deux problèmes.

  • Extrêmement lent/intensif en utilisant Active Record créer. Je n'ai pas exploré les différentes options à créer pour sauter la validation, puisque les modèles sont assez basiques et je suppose qu'il ne fera pas une énorme différence de vitesse
  • Mauvais nettoyage en utilisant un hacky mysqlimport (ce qui signifie des données laissées dans la base de données après le test, malgré un appel explicite à DatabaseCleaner dans un: après le bloc)

Créer le graphe d'objet en mémoire est une possibilité, mais n'étant pas un simulacre j'ai un peu peur d'outrepasser la fonctionnalité AR.

Des idées, des bonnes pratiques?

Merci! Justin

+0

Est ce que le s ample ensemble en lecture seule? C'est à dire. pouvez-vous utiliser les mêmes valeurs dans le tableau pour tous les exemples? – zetetic

+0

Même selon les standards MySQL, 50k lignes sont minuscules.Pensez à gigaoctet/pétaoctet comme de bons marqueurs pour distinguer les bases de données minuscules, petites et grandes. –

Répondre

3

Il est seulement une réponse partielle, mais:

  • utilisant Active Record créer extrêmement lent/intensif. (...) Je suppose que ce ne sera pas faire une énorme différence de vitesse

Il est en fait une grande différence de vitesse. PostgreSQL a un bon guide sur ce point:

http://www.postgresql.org/docs/9.0/interactive/populate.html

La plupart de MySQL il s'applique directement:

  • Utilisez une seule opération, plutôt que beaucoup d'entre eux.
  • Charger les données dans le fichier: http://dev.mysql.com/doc/refman/5.5/en/load-data.html
  • Retirer les index et les recréer après les insertions.
  • Désactiver les contraintes fkey lors du chargement de vos données (en supposant que vos données sont propres, bien sûr).
  • Donnez beaucoup de ressources à MySQL.
  • Désactiver la réplication, le cas échéant.
  • nettoyage incorrect à l'aide d'un mysqlimport hacky (ce qui signifie des données laissées dans la base de données après le test, malgré un appel explicite à DatabaseCleaner dans un: après bloc)

Si vous voulez rincer vos tables de toutes leurs données, essayez troncature:

http://dev.mysql.com/doc/refman/5.5/en/truncate-table.html

+0

Il existe également une empreinte mémoire plus importante pour un objet AR instancié que pour la ligne correspondante dans un fichier SQL qui peuplerait la base de données. –

Questions connexes