Boucler sur plus de 5000 lignes avec Flow

Par Loïc Cimon, le 12 septembre 2021


En fonction du niveau de licence sur Power Automate, les quotas et limites varient. J’ai récemment rencontré l’une d’entre elles sur les boucles ‘Apply to each’ :

Pour charger un fichier Excel volumineux (~50 000 lignes) dans une table SharePoint, j’ai créé un flux qui lit les lignes du fichier via le connecteur Excel, puis insère chaque ligne une à une dans une boucle. Au moment d’exécuter le flux, j’obtiens cette erreur :

Message d'erreur : limite à 5000

En me référant à la documentation, je comprends qu’avec les licences gratuites, trial ou plan per app, le nombre d’itération sur une boucle est de 5000 (100 000 pour les autres licences).

Étant contraint à utiliser une licence standard, j’ai implémenté le workaround suivant pour contourner cette limitation: le flow récupère les lignes par lot de 4999 maximum afin de ne jamais itérer sur plus de 5000 lignes.

Attention
Avec cette implémentation, le temps d’exécution et le nombre d’actions sont augmentent. Ce qui peut vous faire attendre d’autres limites de vos licences. Il est donc à utiliser en connaissance de cause.

Workaround

Ne sachant pas à l’avance le nombre de lignes dans le fichier, j’utilise une boucle ‘Do Until’ avec la condition d’arrêt suivante :

  • Si le lot contient 4999 lignes, on continue et répète le processus avec les 4999 lignes suivantes.
  • Sinon, cela signifie qu’on a atteint la fin du fichier : on s’arrête.

Implémentation

Pour l’implémentation, j’ai besoin de définir 2 variables :

  • Skip – Integer – 0 par défaut : définie le nombre de lignes à ‘sauter’ dans le fichier.
  • Continue – Boolean – Vrai par défaut : indique si la boucle doit continuer (vrai) ou s’arrêter (faux).
Capture de l'initialisation des variables

Boucle Do Until

Ensuite, on paramètre la boucle :

  • On boucle tant que la variable ‘Continue’ est à Vrai.
  • On configure le nombre d’itération maximum à 5000 (ou plus) pour éviter qu’elle ne s’arrête avant la fin du lot
Capture de la boucle Do Until

Traitement du lot

Maintenant que la boucle est en place, il reste à récupérer les lignes par lot de 4999 au lieu de toutes d’un coup. Dans ce cas, j’utilise le connecteur Excel, cela peut être applicable à d’autres.

Deux champs sont importants :

  • Top Count – Il définit le nombre de lignes à renvoyer en résultat, ce qui revient à la taille du lot que l’on veut. Ici : 4999.
  • Skip Count – Il permet d’indiquer le nombre de lignes à ‘sauter’. On utilise ici la variable Skip créée précédemment.

À la première itération, la valeur sera à 0, donc on lira les lignes 1 à 4999. Puis, elle sera incrémentée de 4999, on lira donc les lignes 5000 à 9999, et ainsi de suite. L’incrémentation est expliquée plus bas.

Une fois le lot récupéré, il ne reste plus qu’à appliquer votre traitement sur celui-ci, selon vos besoins.

Capture du traitement d'un lot

Condition d’arrêt

À la fin de la boucle, on se base sur le nombre de lignes récupéré sur ce lot pour déterminer si on atteint la fin du fichier au nom avec l’expression :

length(outputs('List_rows_present_in_a_table')?['body/value']) 
  • Si elle est égale à 4999 (la taille de nombre lot), on continue avec le lot suivant. On incrémente la variable Skip de 4999 pour s’assurer qu’on ne relit pas les mêmes lignes.
  • Sinon, on définit la variable Continue à faux. La condition de la boucle ne sera plus réalisée et s’arrêtera.
Capture de la condition d'arrêt

Vous obtenez donc un flow qui est capable de traiter plus de 5000 lignes en boucles pour les licences standards.

Rappel
Je rappelle que cette implémentation peut être bien utile dans certains cas, mais est à utiliser avec précaution. Car elle rallonge la durée d’exécution et augmente le nombre d’actions qui est également limité !

comments powered by Disqus