J'ai l'agréable tâche de trouver comment gérer les gros fichiers qui sont chargés dans l'éditeur script de notre application (c'est comme VBA pour notre produit interne pour les macros rapides). La plupart des fichiers font environ 300-400 Ko, ce qui est un bon chargement. Mais lorsqu'ils dépassent 100 Mo, le processus a du mal à fonctionner (comme on peut s'y attendre).
Le fichier est lu et placé dans une RichTextBox qui est ensuite parcourue - ne vous inquiétez pas trop de cette partie.
Le développeur qui a écrit le code initial utilise simplement un StreamReader et fait
[Reader].ReadToEnd()
ce qui peut prendre un certain temps.
Ma tâche consiste à décomposer ce bout de code, à le lire par morceaux dans un tampon et à afficher une barre de progression avec une option d'annulation.
Quelques hypothèses :
- La plupart des fichiers seront de 30 à 40 Mo
- Le contenu du fichier est du texte (pas binaire), certains sont au format Unix, d'autres au format DOS.
- Une fois le contenu récupéré, nous déterminons quel est le terminateur utilisé.
- Personne ne se préoccupe, une fois qu'il est chargé, du temps que prend le rendu dans la richtextbox. C'est juste le chargement initial du texte.
Maintenant, les questions :
- Puis-je simplement utiliser StreamReader, puis vérifier la propriété Length (donc ProgressMax) et lancer une lecture pour une taille de tampon définie et itérer dans une boucle while ? WHILST dans un travailleur d'arrière-plan, pour ne pas bloquer le fil d'exécution principal de l'interface utilisateur ? Puis renvoyer le stringbuilder au thread principal une fois qu'il est terminé.
- Le contenu sera envoyé dans un StringBuilder. Puis-je initialiser le StringBuilder avec la taille du flux si la longueur est disponible ?
S'agit-il (selon votre opinion professionnelle) de bonnes idées ? J'ai eu quelques problèmes dans le passé avec la lecture du contenu de Streams, parce qu'il manque toujours les derniers octets ou quelque chose comme ça, mais je poserai une autre question si c'est le cas.
33 votes
Des fichiers de 30-40MB script ? Nom d'un maquereau ! Je n'aimerais pas avoir à réviser ce code...
0 votes
Je sais que cette question est assez ancienne mais je l'ai trouvée l'autre jour et j'ai testé la recommandation pour MemoryMappedFile et c'est de loin la méthode la plus rapide. A titre de comparaison, la lecture d'un fichier de 7 616 939 lignes et 345 Mo via une méthode de lecture en ligne prend plus de 12 heures sur ma machine, alors que le même chargement et la lecture via MemoryMappedFile prennent 3 secondes.
0 votes
C'est juste quelques lignes de code. Voyez cette bibliothèque que j'utilise pour lire des fichiers de 25 Go et plus. github.com/Agenty/FileReader