我需要从磁盘读取1gb原始文本文件到ram,以便在C#中进行一些字符串操作。
string contents = File.ReadAllText(path)
抛出内存异常(不出所料)
最好的方法是什么?
答案 0 :(得分:13)
可能还会考虑使用memory-mapped file
答案 1 :(得分:7)
如果您真的想在内存中进行这种巨大的字符串操作,那么只要您满足以下要求,就不会再运气了
这将解除您所面临的所有内存限制。您的进程内存仅受计算机内存的限制,并且从.NET 4.5 for x64开始,单个.NET对象没有2GiB限制。
答案 2 :(得分:4)
尝试使用System.IO.StreamReader
Any difference between File.ReadAllText() and using a StreamReader to read file contents?
答案 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);
}