2009-12-23 111 views
1

如果您需要能夠存儲大量內存的純文本,因此它可以被搜索和編輯,你會用什麼樣的數據類型?存儲大量文本的內存

比方說,我將一個10000行文檔加載到我的C#應用​​程序中以便用LINQ進行搜索,您將如何在內存中表示它?

不是字符串,因爲它有是可變的,字符串是不可變的。

+1

添加了文本,搜索和linq標記。希望這將有助於讓更多專業知識的人員瞭解如何完成您期望的任務。 –

+0

列表是相當易變的。 –

回答

2

你總是可以使用一個MemoryStream,然後使用一個StreamReader從內存中讀取數據。

你可能會從下面的鏈接中得到一些提示,說明如何在StreamReader中使用LINQ。我不確定它是否與你想要做的完全吻合。

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

你可以用LINQ查詢內存中的數據嗎? –

+1

將StreamReader附加到MemoryStream時,可以使用ReadToEnd()方法將整個內存流讀出爲一個字符串,然後對其進行搜索。你會遇到一些問題,試圖使用內置的.NET的東西來做高性能,高負載的字符串操作。自己編寫搜索例程以搜索內存流可能會更好。另外,如果您正在從磁盤讀取數據,則不必一次將其全部讀入內存。流讀取器可以從磁盤讀取塊中的數據以減少內存使用量。 –

+0

剛剛添加了一篇博客文章的鏈接,該鏈接描述了一種擴展方法技術,該技術允許您使用LINQ來搜索大型文本文件,而無需將整個文件加載到內存中。它使用我建議的StreamReader技術,但有一個實際的代碼示例,我更新了包含的答案。這是一種使用LINQ搜索文本文件的非常簡潔的方式。強烈推薦。 –

2

Stringbuilder會適合。在內部它是一個緩衝區,並且是可變的。

+1

和性能明智,這是一個可行的選擇? –

+0

如果你做得很好,應該是。關鍵是要在stringbuilder的內部char []上進行搜索,所以你不會做大量的字符串alloc/deallocs來做搜索。這是我認爲你可能會遇到的唯一問題,即由Brian提供的streamreader/memory stream選項。 –

0

StringBuilder的使用堆內存分配,這可能導致在內存不足異常在運行時。

謝謝