2010-12-08 25 views
0

Je souhaite compter les occurrences de mots dans un ensemble de fichiers texte. Tout comme ici http://doc.trolltech.com/4.5/qtconcurrent-wordcount-main-cpp.htmlC++ Qt WordCount et grands ensembles de données

Le problème est que j'ai besoin de traiter une très grande quantité de fichiers en texte brut - donc mon résultat dans QMap ne peut pas rentrer dans la mémoire.

Je ai googlé l'algorithme de tri de fusion de la mémoire externe (basé sur des fichiers), mais je suis trop paresseux pour m'implémenter. Donc, je veux diviser le résultat défini par des parties pour s'adapter à chacun d'eux en mémoire. Puis stocker ces parties dans des fichiers sur le disque. Ensuite, appelez la fonction magique mergeSort (QList, result_file) et obtenez le résultat final dans result_file.

Est-ce que quelqu'un connaît l'implémentation compatible Qt de cet algo? En bref, je suis à la recherche de pythons heapq.merge (http://docs.python.org/library/heapq.html#heapq.merge) analogique mais pour les conteneurs Qt.

Répondre

0

Vous pourriez vouloir consulter celui-ci: http://stxxl.sourceforge.net/

Ce n'est pas exactement ce que vous recherchez (fermer assez bien), mais je suppose que vous ne trouverez pas exactement ce que vous voulez travailler avec des listes Qt. Puisque vous implémentez alghoritm en créant cette liste, changer son type ne devrait pas poser de problème. Pour autant que je me souvienne de cette liste, vous pouvez utiliser des algorithmes standards de tri stl. Le seul problème reste la préformance.

0

Je présume que la carte contient l'association entre le mot et le nombre d'occurrences. Dans ce cas, pourquoi dites-vous que vous avez une consommation de mémoire si importante? Combien de mots et de formes distincts pourriez-vous avoir et quelle est la consommation moyenne de mémoire pour un mot? Considérant 1.000.000 mots, avec une consommation de mémoire de 1K par mot (qui inclut le texte du mot, le stockage spécifique QMap), ce qui conduirait à (environ) 1 Go de mémoire, ce qui ... ne semble pas tellement pour moi.