C# 用C语言读取大型文件#

C# 用C语言读取大型文件#,c#,.net,streamreader,C#,.net,Streamreader,我必须逐行读取一个4-10gb的大文件,问题是当我读取~2gb时,.Net进程会获取和退出内存异常 首先,我只是试图计算行数,但是我需要单独访问每一行以从中提取一些数据 从我所看到的,每个选项都在内存中保留前面的行,我只希望它保留当前读取的行(除非有人知道保留所有行的诀窍) 这是我试过的,还有一些类似的东西: StreamReader reader = File.OpenText(FilePath); while ((line = reader.ReadLine()) != null) /

我必须逐行读取一个4-10gb的大文件,问题是当我读取~2gb时,.Net进程会获取和退出内存异常

首先,我只是试图计算行数,但是我需要单独访问每一行以从中提取一些数据

从我所看到的,每个选项都在内存中保留前面的行,我只希望它保留当前读取的行(除非有人知道保留所有行的诀窍)

这是我试过的,还有一些类似的东西:

StreamReader reader = File.OpenText(FilePath);
while ((line = reader.ReadLine()) != null)    //This is where it errors
{
   count++;
}
reader.Close();
例外情况是:

Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
at System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32  charCount)
at System.IO.StreamReader.ReadLine()
at CSV.Program.NumLines() in C:\Users\ted\Documents\Visual Studio 2015\Projects\vConnect\CSV\CSV\Program.cs:line 100
 at CSV.Program.Main(String[] args) in C:\Users\ted\Documents\Visual Studio 2015\Projects\vConnect\CSV\CSV\Program.cs:line 20
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

谢谢

您可以使用类FileStream:和FileStream.Seek中的方法。Seek应该允许您执行所需的操作。可以在此处找到一个示例:

你必须稍微修改一下,但基本上你可以从0开始,阅读直到找到换行符,处理行,从你到达的地方开始,然后重复。它的效率不会太高,但会完成工作


希望这能有所帮助。

不,如果每一行的长度都合理,那么它应该是绝对正确的,前提是您实际上没有自己保存数据。您不需要调用
DiscardBufferedData
。在从数据中剥离某些内容之后,您的真实代码对数据做了什么?请发布完整的异常,包括它的调用堆栈和实际发生的代码。无需丢弃缓冲数据。引起问题的不是缓冲区,而是如何处理读取的字符串。我认为,
DiscardBufferedData
并不像您认为的那样。它只用于重新同步读卡器和底层流。您是否在没有额外方法调用的情况下尝试过此操作?看起来像是一个行尾问题-unix与windows?尝试
flip
。从技术上讲,这是可能的,发生在文件损坏且不再包含文本时。例如,只有二进制零。完全属于“垃圾事件”类别,你永远不应该为这种类型编写代码,因为你仍然无法从该文件中获得任何可用数据。是的,你的正确,我可以逐行阅读一些修改。你所要做的就是重新发明轮子
StreamReader
已经做到了这一点,事实上做得相当好。
StreamReader
的替换代码很可能会出错。(对于二进制文件,您显然不应该使用
StreamReader
)同意,在理想情况下,您应该使用StreamReader。不幸的是,不管出于什么原因,这在这里不起作用。。。对于像逐行阅读这样简单的事情,我不确定“搞砸”的风险是否会高到足以阻止我个人使用这个解决方案,但其他人可能有不同的意见。