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

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

string contents = File.ReadAllText(path) 

抛出内存exception(不出所料)

最好的方法是什么?

可能还会考虑使用内存映射文件

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

  1. 编译目标x64
  2. 在x64系统中运行
  3. 目标.NET 4.5

这将解除您面临的所有内存限制。 您的进程内存仅受计算机内存的限制,并且从.NET 4.5 for x64开始,单个.NET对象没有2GiB限制。

尝试使用System.IO.StreamReader

File.ReadAllText()与使用StreamReader读取文件内容之间的任何区别?

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

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

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

我使用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); }