Enumerable.Take
fait dans le flux de résultats fait sortir; il ne met pas entièrement sa source en mémoire tampon et ne retourne que le premier N. En regardant votre solution d'origine, le problème est que l'entrée à laquelle vous voulez faire un Take
est String.Split
. Malheureusement, cette méthode n'utilise aucune sorte d'exécution différée; il crée avec empressement un tableau de tous les 'splits' et le renvoie ensuite.
Par conséquent, la technique pour obtenir une séquence de diffusion en continu de mots de texte serait quelque chose comme:
var words = src.StreamingSplit() // you'll have to implement that
.Take(1000);
Cependant, je note que le reste de votre requête est:
...
.GroupBy(str => str) // group words by the value
.Select(g => new
{
str = g.Key, // the value
count = g.Count() // the count of that value
});
Notez que GroupBy
est une opération de mise en tampon - vous pouvez vous attendre à ce que tous les 1000 mots de sa source finissent par être stockés quelque part dans le processus des groupes en cours d'acheminement.
Comme je le vois, les options sont:
- Si vous ne me dérange pas de passer par tout le texte pour fractionnement fins, alors
src.Split().Take(1000)
est très bien. L'inconvénient est le temps perdu (pour continuer à se séparer après qu'il n'est plus nécessaire) et l'espace gaspillé (pour stocker tous les mots dans un tableau, même si seulement les 1000 premiers) seront nécessaires. Toutefois, le reste de la requête ne fonctionnera pas plus de mots que nécessaire.
- Si vous ne pouvez pas vous permettre de faire (1) en raison de contraintes de temps/mémoire, passez à
src.StreamingSplit().Take(1000)
ou équivalent. Dans ce cas, aucun texte original ne sera traité après que 1000 mots ont été trouvés.
Prenez note que ces 1000 mots eux-mêmes finiront par se tamponnés par la clause GroupBy
dans les deux cas.
'Take()' est un paresseux fonction! Cela ne fait pas tous les mots à calculer. Voir http://ideone.com/WwDwg par exemple. – Vlad