2010-04-24 11 views
4

J'essaye d'utiliser python pour obtenir des performances sur une tâche qui peut être fortement parallélisée en utilisant http://docs.python.org/library/multiprocessing. En regardant leur bibliothèque, ils disent utiliser la taille de bloc pour les itérations très longues. Maintenant, mon itérable n'est pas long, un des dicts qu'il contient est énorme: ~ 100000 entrées, avec des tuples comme clés et des tableaux chiffrés pour les valeurs.Comment choisir une taille de segment pour le multitraitement python avec de grands ensembles de données

Comment est-ce que je placerais la taille de morceau pour manipuler ceci et comment je peux transférer ces données rapidement?

Merci.

Répondre

2

La seule façon de gérer ce grand élément unique dans plusieurs travailleurs à la fois est de le diviser. multiprocessing fonctionne en divisant le travail en unités, mais la plus petite unité que vous pouvez nourrir est un objet - il ne peut pas savoir comment diviser un seul objet d'une manière qui est raisonnable. Vous devez le faire vous-même, à la place. Au lieu d'envoyer les dits sur lesquels travailler, divisez les dits en unités de travail plus petites et envoyez-les à la place. Si vous ne pouvez pas diviser la dict parce que toutes les données sont interdépendantes, vous ne pouvez pas vraiment séparer le travail.

+0

Ah ok c'est logique. Actuellement, les ouvriers saisissent chacun la dictée géante, en font une copie, la modifient et retournent ensuite leur version. (pas exactement poids léger). Puisque vous semblez au gars qui connaît son multi-traitement python: Si le géant dict où être lu seulement est-il un moyen de permettre à tous les travailleurs d'accéder à ses données au besoin efficacement? (Ce serait facile avec les threads, mais avec le multiprocessing il devient difficile rapide, il semble) – Sandro

+0

Si vous n'êtes pas sur Windows, et que vous faites en sorte que cette 'lecture seule' fasse partie du processus * avant * vous engendrer des travailleurs, et stocker dans (par exemple) un global ou un local fermé, tous les travailleurs peuvent y accéder sans subir le coût de sérialisation. –

+0

Euh oh, je me rends compte maintenant que j'utilise la mauvaise terminologie. J'utilise en fait la fonction Pool.map_async() pour faire tout cela. Ai-je raison de supposer qu'en utilisant la carte, il n'y a pas de solution, seulement en forçant. Y a-t-il un coût sérieux pour se regrouper? – Sandro