2010-10-20 6 views
1

J'ai besoin de lire ligne par ligne à partir du fichier texte (fichiers journaux du serveur) et ils sont gros (environ 150-200 Mo). J'utilise StreamReader et c'est génial pour les "petits" fichiers comme 12MB mais pas pour les gros. Après un certain temps, il est chargé et il apparaît dans mon DataGridView mais son énorme en mémoire. J'utilise bindingSource.Filter sur cette DataGridView (comme la zone de texte et quand l'utilisateur écrit une lettre, il filtre une colonne en comparant les chaînes, ne montre pas les lignes sans les lettres dans textbox et ainsi) et avec les gros fichiers, il est également inutile. Donc, je veux vous demander quelle est la meilleure solution pour moi.Lire de gros fichiers texte à datagridviewer un filtrage

que je cherchais et trouver des solutions mais je besoin d'aide décidé ce qui est le mieux pour moi et avec la mise en œuvre (ou s'il y a quelque chose d'autre):

  1. Charger des données en arrière-plan et les montrant en temps réel. Je ne suis pas vraiment sûr de savoir comment faire cela et je ne sais pas quoi faire avec le filtrage dans cette solution.
  2. Peut-être mettre à jour en quelque sorte streamreader? Ou écrire sa propre méthode pour lire les lignes du fichier avec les lecteurs binaires?
  3. J'ai trouvé quelque chose à propos de Memory-Mapped dans C# 4.0 mais je ne peux pas utiliser 4.0. Est-ce que cela pourrait aider l'aide?

Merci pour l'aide


Ok, donc je suis et je Paging la mise en œuvre lu 5k lignes de fichier texte que après avoir cliqué sur bouton suivant des lignes et ainsi. J'utilise BaseStream.Position pour enregistrer une lecture de départ, mais je voudrais utiliser une autre fonction qui enregistre le nombre de lignes et principalement je veux utiliser la méthode pour commencer à lire à partir de la ligne exacte, mais je ne trouve rien pour StreamReader. Y a-t-il quelque chose comme ça?

Répondre

1

Charger les données en arrière-plan et les afficher en temps réel. Je ne suis pas vraiment sûr de savoir comment faire cela et je ne sais pas quoi faire avec le filtrage dans cette solution.

Ceci n'est d'aucune aide. Il consommera encore beaucoup de mémoire dans le fil d'arrière-plan.

Peut-être mettre à jour en quelque sorte streamreader? Ou écrire sa propre méthode pour lire les lignes du fichier avec les lecteurs binaires?

Toujours pas d'aide, une fois que vous avez lu le fichier en entier, il va consommer de la mémoire.

Je pense que vous avez compris. Ne chargez pas le fichier entier en mémoire. Chargez seulement des morceaux de celui-ci. Utilisez la pagination. En tout cas, vous ne pouvez pas afficher 200 Mo de données sur un seul écran, ne chargez donc que la partie que vous souhaitez afficher à l'écran. Donc, fondamentalement, vous devez implémenter la fonction suivante:

public IEnumerable<string> ReadFile(int page, int linesPerPage, out totalLines) 
{ 
    ... 
} 

Les Skip et Take méthodes d'extension pourraient être utiles ici.

+0

Et que dois-je faire avec le filtrage? Comme je le mentionne, je devrais à nouveau charger le fichier en comparant les chaînes à droite? Lorsque l'utilisateur change (ajouter, supprimer) lettre je devrais à nouveau commencer avec le chargement du fichier et le contrôle de la ligne à afficher et qui ne pas? –

+0

Vous pouvez avoir un paramètre supplémentaire à la fonction ReadFile qui vous permettra de filtrer les lignes. –

+0

Ok, merci, je vais essayer. –

Questions connexes