我有一個需要閱讀從1gb原始文本文件從磁盤到RAM在C#中做一些字符串操作。C#非常大的字符串操作(內存不足異常)
string contents = File.ReadAllText(path)
拋出內存異常(不出所料)
什麼是去了解這一點的最好方式嗎?
我有一個需要閱讀從1gb原始文本文件從磁盤到RAM在C#中做一些字符串操作。C#非常大的字符串操作(內存不足異常)
string contents = File.ReadAllText(path)
拋出內存異常(不出所料)
什麼是去了解這一點的最好方式嗎?
可能嘗試也看看使用memory-mapped file
從文檔看來,您會使用「MemoryMappedViewStream」,然後拉入一些字節塊。如有必要,請使用'Encoding.GetString' [http://msdn.microsoft.com/en-us/library/05cts4c3.aspx]。 – Dave 2011-05-13 14:25:07
與System.IO.StreamReader
Any difference between File.ReadAllText() and using a StreamReader to read file contents?
如果別人建議的解決方案不工作,我建議你設置字符的限制閱讀,閱讀文本按部分。一旦你緩存了一部分文本,你就可以操縱它。
如果需要在任何方向操縱它(我的意思是,不從左至右在一個步驟),你總是可以實現在節點:)
一個B-Tree
和存儲部件的文本有時,按順序閱讀文本幾乎是不可能的,這裏就是B-Tree的幫助。我大約一年前爲了學術目的(微型數據庫管理器)實現了它,但我認爲應該在C#中實現它。當然,你將不得不實現如何從文件加載BTree的節點。
如果你真的想這樣做在內存中這個巨大的字符串操作,那麼你是不是運氣不好了,只要你能滿足下列要求
這將解除您面臨的所有內存限制。您的進程內存將僅受計算機內存的限制,並且從.NET 4.5 for x64開始的單個.NET對象上不存在2GiB限制。
我對109 MB文件使用ReadAllText,並且內存越來越奇怪。無論如何,所以我使用緩衝區來讀取性能良好的文件,並使用StringBuilder來提高內存的效率。 這是我的代碼:
StringBuilder sb = new StringBuilder();
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
sb.AppendLine(line);
}
什麼樣的字符串操作?在任何特定時間只閱讀一些部分是否可行? – 2011-05-09 22:10:55
理論上是的,但工作瓦特/遺產代碼,我知道這將被使用的環境,它會更容易閱讀一次去。 – 2011-05-09 22:12:55
我假設你在PC上有足夠的可用RAM,你正在嘗試使用這個RAM。我知道修改遺留代碼可能是一件痛苦的事情(如果它的任務至關重要,那麼可怕也是可怕的),但是您可能需要考慮一次只閱讀一個塊並以這種方式處理它。 – 2011-05-09 22:19:55