2009-12-23 4 views
1

Если вам нужно хранить большое количество обычного текста в памяти, чтобы его можно было искать и редактировать, какой тип данных вы использовали бы?Сохранение больших объемов текста в памяти

Скажем, я загружаю документ 10000 в мое приложение C# для поиска в LINQ, как бы вы представляли его в памяти?

Не строка, потому что она может быть изменчивой, а строки неизменяемы.

+1

Добавлен текст, поиск и теги linq. Надеюсь, это поможет привлечь кого-то с более специализированными знаниями о том, как выполнить то, что вы хотите сделать. –

+0

A Список довольно изменчив. –

ответ

2

Вы всегда можете использовать MemoryStream, а затем использовать StreamReader для чтения данных из памяти.

Вы можете получить некоторый подъем от следующей ссылки, которая говорит об использовании LINQ с StreamReader. Я не уверен, соответствует ли это именно тому, что вы пытаетесь сделать.

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

Из блога:

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(); 

Вы хотели бы изменить StreamReader экземпляра к чему-то вроде

StreamReader sr = new StreamReader(myMemoryStreamVar) 

или что-то подобное.

+0

Вы можете запросить данные в memystream с LINQ? –

+1

Когда вы присоединяете StreamReader к MemoryStream, вы можете использовать метод ReadToEnd(), чтобы считывать весь поток памяти в строку и затем искать ее. У вас возникнут некоторые проблемы с использованием встроенных компонентов .NET для выполнения высокопроизводительных операций с высокой загрузкой. Возможно, было бы лучше написать обычную процедуру поиска для поиска по потоку памяти. Кроме того, если вы читаете данные с диска, вам не нужно читать все это сразу. Считыватель потока может считывать данные в блоке с диска, чтобы сохранить использование памяти. –

+0

Просто добавлена ​​ссылка на сообщение в блоге, в котором описывается метод метода расширения, который позволяет использовать LINQ для поиска в больших текстовых файлах без загрузки всего файла в память. Он использует метод StreamReader, который я предложил, но имеет фактический образец кода, который я обновил, чтобы мой ответ содержал. Это довольно аккуратный способ поиска текстовых файлов с использованием LINQ. Настоятельно рекомендуется. –

2

Stringbuilder подойдет. Внутренне это буфер, и он изменен.

+1

и производительность - это приемлемый вариант? –

+0

Если вы хорошо проводите поиск, это должно быть. Ключ должен был бы выполнять поиск на внутреннем char [] строкового конструктора, поэтому вы не будете делать тонны string alloc/deallocs только для ваших поисков. Это единственная проблема, я думаю, что у вас есть опция потока streamreader/memory stream, предоставленная Брайаном. –

0

StringBuilder использует кучу для выделения памяти, что может привести в из исключений памяти во время выполнения.

Смежные вопросы