C#超大字符串操作(内存不足)

时间:2011-05-09 22:08:20

标签: c# string file-io

我需要从磁盘读取1gb原始文本文件到ram,以便在C#中进行一些字符串操作。

string contents = File.ReadAllText(path)

抛出内存异常(不出所料)

最好的方法是什么?

5 个答案:

答案 0 :(得分:13)

可能还会考虑使用memory-mapped file

答案 1 :(得分:7)

如果您真的想在内存中进行这种巨大的字符串操作,那么只要您满足以下要求,就不会再运气了

  1. 编译定位x64
  2. 在x64系统中运行
  3. 目标.NET 4.5
  4. 这将解除您所面临的所有内存限制。您的进程内存仅受计算机内存的限制,并且从.NET 4.5 for x64开始,单个.NET对象没有2GiB限制。

答案 2 :(得分:4)

答案 3 :(得分:0)

如果其他人建议解决方案不起作用,我建议您设置要读取的字符数限制,并按部分阅读文本。缓存部分文本后,您可以对其进行操作。

如果你需要在任何方向操作它(我的意思是,不是从一个步骤从左到右),你总是可以实现一个B-Tree并存储部分文本节点:)

有时几乎不可能按顺序按部分阅读文本,这里是B-Tree帮助的地方。我大约一年前为学术目的实现了它(一个小型​​数据库管理器),但我认为应该在C#中实现它。当然,您必须实现如何从文件中加载BTree的节点。

答案 4 :(得分:0)

我使用的是ReadAllText,用于109 MB的文件,并且内存不足,这真的很奇怪。无论如何,所以我使用缓冲区来读取具有良好性能的文件和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);
                }