Comment ai-je pu lire un très gros fichier texte à l'aide de StreamReader?
Je veux lire un énorme .fichier txt et je suis un débordement de la mémoire en raison de sa taille.
Toute aide?
private void button1_Click(object sender, EventArgs e)
{
using (var Reader = new StreamReader(@"C:\Test.txt"))
{
textBox1.Text += Reader.ReadLine();
}
}
Fichier texte est juste:
Line1
Line2
Line3
Littéralement comme ça.
Je veux charger le fichier texte à une zone de texte multiligne telle qu'elle est, à 100% copier.
- Lire et traiter ligne par ligne, ou de les casser en morceaux et de traiter avec les morceaux individuellement. Vous pouvez également nous montrer le code que vous avez, et dites-nous ce que vous essayez d'accomplir avec elle.
- Comment dois-je procéder? J'ai vu une semblable question ici mais je ne le trouve pas. La recherche ne fonctionne pas bien pour moi.
- Si vous postez, vous obtiendrez un upvote 🙂
- recherche astuce : essayez de keyword1 +keyword2 etc : )
- Comment en êtes-vous un débordement de la mémoire lorsque vous êtes en train de lire une seule ligne de texte?
- Quelle est la taille du fichier texte? Il y a une limite pratique à la textBox1.Texte de la propriété.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, le code que vous avez posté ne mettre la première ligne du fichier dans le
TextBox
. Ce que vous voulez, c'est ceci:Maintenant, comme pour le
OutOfMemoryException
: je n'ai pas testé, mais avez-vous essayé leTextBox.AppendText
méthode au lieu d'utiliser+=
? Ce dernier sera certainement l'allocation d'une tonne de chaînes, dont la plupart vont être à peu près de la longueur de l'ensemble du dossier par le temps que vous près de la fin du fichier.Pour tout ce que je sais,
AppendText
fait la même; mais son existence m'amène à penser qu'il est là pour faire face à ce scénario. J'ai peut-être tort, comme je l'ai dit, n'ai pas testé personnellement.EndOfStream
de consommer de la ligne précédente, de sorte que la ligne suivante peut être lu? Je ne le savais pas. Semble un peu paradoxal.EndOfStream
de consommer de la ligne précédente; il a juste besoin de vérifier cette propriété à savoir quand s'arrêter. Le problème est que l'OP n'a pas été en utilisant une boucle à tous; il a été continuellement de la création d'un nouveauStreamReader
et de l'appel deReadLine
une fois par exemple.AppendText
à la place. Mais je me devais d'être honnête et admettre que je ne suis pas vraiment sûr deAppendText
n'est pas seulement l'appel de+=
lui-même.Vous obtiendrez beaucoup plus rapide de la performance avec les éléments suivants:
Il pourrait également aider avec votre problème de mémoire, car vous perdez une énorme quantité de mémoire à allouer successivement les grandes chaînes avec chaque ligne lue.
Accordée, le GC est de collecter le plus âgé des chaînes avant de voir un
OutOfMemoryException
, mais je donnerais le au-dessus d'un coup de toute façon.De la première utilisation d'une riche zone de texte au lieu d'un régulier de la zone de texte. Ils sont beaucoup mieux équipés pour les grandes quantités de données que vous utilisez. Cependant, vous devez toujours lire les données.
De lire et de traiter ligne par ligne, ou de les casser en morceaux et de traiter avec les morceaux individuellement. Vous pouvez également nous montrer le code que vous avez, et dites-nous ce que vous essayez d'accomplir avec elle.
Voici un exemple: C# Lecture De Fichier Texte Contenant Des Données Délimitées Par Des Tabulations Avis de la
ReadLine()
etWriteLine()
consolidés.Zone de texte est sévèrement limitée par le nombre de caractères qu'il peut contenir. Vous pouvez essayer d'utiliser le
AppendText()
méthode sur unRichTextBox
à la place.while
boucle, la vérification de laEndOfStream
de la propriété sur à chaque itération. Jetez un oeil à ma réponse.