如何使用C#中的线程读取和解析非常大的平面文件?
我必须读取一个大的文本文件,并使用C#逐行解析它。对于小文件,可以使用如何使用C#中的线程读取和解析非常大的平面文件?,c#,C#,我必须读取一个大的文本文件,并使用C#逐行解析它。对于小文件,可以使用StreamReader轻松完成,但在处理大文件时遇到内存不足异常。如何使其适应大文件 以下代码捕获了OutOfMemoryException using (StreamReader reader = new StreamReader(FileNameWithPath)) { while ((line = reader.ReadLine()) != null) { // Do something
StreamReader
轻松完成,但在处理大文件时遇到内存不足异常。如何使其适应大文件
以下代码捕获了OutOfMemoryException
using (StreamReader reader = new StreamReader(FileNameWithPath))
{
while ((line = reader.ReadLine()) != null)
{
// Do something here...
}
}
这几乎是惰性行读取器的标准代码,并且不应该导致OutOfMemoryException
,除非有一些真正的大单行。您也可以尝试:
foreach(var line in File.ReadLines(FileNameWithPath)) {
// Do something here...
}
这只是使它更干净,但做同样的事情。因此有两种选择:
一条或多条“线”非常大
“在这里做点什么”中的某些东西正在慢慢(或很快)吞噬你的记忆
我希望后者更像。我不确定这一点,但尝试一下这类.net框架
-内存映射文件将文件内容映射到应用程序的逻辑地址空间。内存映射文件使程序员能够处理非常大的文件,因为内存可以并发管理,并且它们允许完全、随机地访问文件,而无需搜索。内存映射文件也可以跨多个进程共享。指定缓冲区大小如何
using (var inputFile = new System.IO.StreamReader(sourceFilePath))
{
while (inputFile.Peek() >= 0) {
string lineData = inputFile.ReadLine();
// Do something with lineData
}
}
像这样
using (var reader = new StreamWriter(path,false,Encoding.UTF8, 1000))
{
.....
}
哪一行捕获异常?这个代码对我来说很好。例外似乎来自“在这里做点什么…”-那么你到底在做什么(请写一些代码)?意识到你完全歪曲了事实。导致内存不足异常的不是流读取器,也不是读取,而是我们没有看到的代码“//在这里做点什么”。当然,除非一行中有数百兆字节。我同意//在这里做点什么…,这可能是个问题,但也要注意,如果您使用的是.Net 4或更高版本,您可以使用File.ReadLines()获取可以与foreach一起使用的字符串枚举器。虽然这是真的,但是StreamReader
似乎完全适合所描述的情况。@MarcGravel-同意你的观点,但我几周前刚刚读过关于这个类的内容……但我没有尝试过,但这可能会有帮助……该检查在语义上与问题代码中的null
检查相同