я должен прочитать большие файлы 4-10gb каждую строки за строкой, проблема заключается в том, что процесс .Net получает и OutOfMemory исключения, когда я прочитал ~ 2gbЧтения больших файлов в C#
В первом я просто пытаюсь для подсчета строк, однако мне нужно будет получить доступ к каждой строке индивидуально, чтобы удалить некоторые данные из нее.
Из того, что я могу видеть, каждый вариант сохраняет предыдущие строки в памяти, где я только хочу, чтобы это сохранить для чтения в настоящее время линии (если кто не знает, трюк, чтобы держать все это)
Вот что я пытались, и несколько вещей нравится:
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()
Благодарности
Нет, если каждая строка имеет разумную длину, она должна быть абсолютно прекрасной, если вы фактически не храните данные самостоятельно. Вам не нужно вызывать 'DiscardBufferedData'. Каков ваш * реальный * код, который делает с данными после удаления чего-либо из него? –
Пожалуйста, разместите * полное * исключение, включая его стек вызовов и фактический код, где он встречается. Нет необходимости отбрасывать буферные данные. Это * не * буфер, который вызывает проблемы, но как вы обрабатываете строки, которые вы читаете. –
Я не думаю, что 'DiscardBufferedData' делает то, что вы думаете. Он используется только для повторной синхронизации Reader и базового потока. Вы пробовали это без дополнительного вызова метода? – hometoast