2010-07-25 5 views
0

J'utilise MongoDB une base de données nosql. Fondamentalement, à la suite d'une requête, j'ai une liste de dicts qui eux-mêmes contiennent des listes de dictionnaires ... dont j'ai besoin de travailler avec.Accélérer l'analyse des énormes listes de dictionnaires - Python

Malheureusement traitant de toutes ces données dans Python peut être ramené à une analyse lorsque les données sont trop.


Je n'ai jamais dû faire face à ce problème, et ce serait formidable si quelqu'un avec l'expérience pourrait donner quelques suggestions. =)

+0

Et en utilisant une base de données "YesSQL" (peut-être juste comme un intermédiaire) présente également les mêmes problèmes? - qui devrait être responsable simplement en regardant un profil de performance. –

+0

Alors, quel est le problème? – nazca

+0

@pst L'utilisation d'un backend NoSQL n'est pas toujours valable pour la nouveauté; MongoDB a de grands avantages quand il s'agit de performances en temps réel et de partage de données. – mattbasta

Répondre

3

Voulez-vous vraiment récupérer toutes ces données dans votre programme Python? Si c'est le cas, récupérez-le un peu à la fois, mais si tout ce que vous voulez faire est de récapituler les données, utilisez mapreduce dans MongoDB pour distribuer le traitement et retourner simplement les données résumées. Après tout, le point sur l'utilisation d'une base de données NoSQL qui répartit correctement toutes les données sur plusieurs machines est précisément d'éviter d'avoir à tout ramener sur une seule machine pour le traitement.

+0

Je suis entièrement d'accord avec vous. Je suis un peu inexpérimenté avec les requêtes MongoDB que je peux faire et je suis un peu limité à cause de ça. Pour l'instant, je gère ces dicts au sein de Python car il est assez simple de le faire. Merci pour votre réponse. – RadiantHex

1

Chargez-vous toutes les données dans la mémoire à la fois? Si c'est le cas, vous pourriez faire en sorte que le système d'exploitation permute la mémoire sur le disque, ce qui peut amener n'importe quel système à explorer. Les dictionnaires sont des hashtables donc même une dictée vide consommera beaucoup de mémoire, et d'après ce que vous dites, vous en créez beaucoup en même temps. Je ne connais pas l'API MongoDB, mais je suppose qu'il y a une manière d'itérer les résultats un à la fois au lieu de lire tout l'ensemble des résultats à la fois - essayez d'utiliser cela. Ou réécrivez votre requête pour renvoyer un sous-ensemble des données.

Si l'échange de disque n'est pas le problème, puis profilez le code pour voir quel est le goulot d'étranglement, ou mettez un exemple de code dans votre question. Sans plus d'informations spécifiques, il est difficile de donner une réponse plus spécifique.

Questions connexes