alors imaginons un grand document xml (taille de fichier> 100 mb) que nous voulons itérer en utilisant cElementTree.iterparse.divisant et conquérant etree.iterparse en utilisant le multiprocessing
Mais tous ces cœurs que nous a promis Intel seraient utiles, comment les utilisons-nous? voici ce que je veux:
from itertools import islice
from xml.etree import ElementTree as etree
tree_iter = etree.iterparse(open("large_file.xml", encoding="utf-8"))
first = islice(tree_iter, 0, 10000)
second = islice(tree_iter, 10000)
parse_first()
parse_second()
Il semble y avoir plusieurs problèmes avec cela, pas le moins étant que le itérateur retourné par iterparse() semble résister à trancher.
Est-il possible de diviser la charge de travail de l'analyse d'un document XML volumineux en deux ou quatre tâches distinctes (sans charger le document entier en mémoire? Le but étant alors d'exécuter les tâches sur les processeurs séparés.
donc je devine que j'appelle alors workers.add_task avec une fonction qui analyse chaque élément individuel? pour elem dans etree.parseiter(): workers.add_task (parseElem, elem)? le problème est que, puisque l'analyse est relativement simple, cela n'entraîne aucun gain de performance. ce dont j'ai besoin est de diviser le etree.parseiter() en morceaux maniables: idéalement, sur les 100.000 éléments de l'itération, donnez 25.000 à chaque thread de la piscine. est-ce possible? –
Cela dépend de ce que vous faites, mais je suppose. – orlp