2009-12-23 5 views
1

Si vous devez pouvoir stocker une grande quantité de texte brut en mémoire afin de pouvoir le rechercher et le modifier, quel type de données utiliseriez-vous? Supposons que je charge un document de 10000 lignes dans mon application C# pour rechercher avec LINQ, comment le représenterais-tu en mémoire?Stocker de grandes quantités de texte en mémoire

Pas une chaîne, car elle peut être modifiée, et les chaînes sont immuables.

+1

Ajout de balises de texte, de recherche et de ligne. J'espère que cela aidera à faire venir quelqu'un avec des connaissances plus spécialisées sur la façon d'accomplir ce que vous cherchez à faire. –

+0

Une liste est tout à fait modifiable. –

Répondre

2

Vous pouvez toujours utiliser un MemoryStream, puis utiliser StreamReader pour lire les données de la mémoire.

Vous pourriez obtenir un ascenseur à partir du lien suivant qui parle de l'utilisation de LINQ avec un StreamReader. Je ne suis pas sûr que cela corresponde exactement à ce que vous essayez de faire.

http://blogs.msdn.com/ericwhite/archive/2006/08/31/linq-to-text-files.aspx

Depuis le blog:

StreamReader sr = new StreamReader("TextFile.txt"); 

    var t1 = 
    from line in sr.Lines() 
    let items = line.Split(',') 
    where ! line.StartsWith("#") 
    select String.Format("{0}{1}{2}", 
     items[1].PadRight(16), 
     items[2].PadRight(16), 
     items[3].PadRight(16)); 

    var t2 = 
    from line in t1 
    select line.ToUpper(); 

    foreach (var t in t2) 
    Console.WriteLine(t); 

    sr.Close(); 

Vous voudriez changer l'instanciation StreamReader à quelque chose comme

StreamReader sr = new StreamReader(myMemoryStreamVar) 

ou quelque chose de similaire.

+0

pouvez-vous interroger les données dans le flux de mémoire avec LINQ? –

+1

Lorsque vous attachez un StreamReader à un MemoryStream, vous pouvez utiliser la méthode ReadToEnd() pour lire le flux de mémoire entier dans une chaîne, puis le rechercher. Vous allez avoir quelques problèmes en essayant d'utiliser les choses. NET intégrées pour faire des opérations de chaîne de haute performance et haute charge. Il peut être préférable d'écrire la routine de recherche vous-même pour rechercher dans le flux de mémoire. En outre, si vous lisez les données à partir du disque, vous n'avez pas besoin de les lire toutes en mémoire à la fois. Le lecteur de flux peut lire les données en bloc à partir du disque pour réduire l'utilisation de la mémoire. –

+0

Juste ajouté un lien vers un article de blog qui décrit une technique de méthode d'extension qui vous permet d'utiliser LINQ pour rechercher dans de gros fichiers texte sans charger le fichier entier dans la mémoire. Il utilise la technique StreamReader que j'ai suggérée mais a un échantillon de code réel que j'ai mis à jour ma réponse pour contenir. C'est un bon moyen de rechercher des fichiers texte en utilisant LINQ. Hautement recommandé. –

2

Stringbuilder convient. En interne, c'est un tampon, et est mutable.

+1

et la performance sage, est-ce une option faisable? –

+0

Si vous faites bien vos recherches, cela devrait l'être. La clé serait de faire les recherches sur le char interne [] du stringbuilder, donc vous ne feriez pas des tonnes de chaine alloc/deallocs juste pour faire vos recherches. C'est le seul problème que je pense que vous auriez avec l'option streamreader/memory stream donnée par Brian. –

0

StringBuilder utilise tas pour l'allocation de mémoire, ce qui peut entraîner des exceptions à la mémoire lors de l'exécution.

Merci

Questions connexes