2016-04-12 3 views
2

я должен прочитать большие файлы 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() 

Благодарности

+5

Нет, если каждая строка имеет разумную длину, она должна быть абсолютно прекрасной, если вы фактически не храните данные самостоятельно. Вам не нужно вызывать 'DiscardBufferedData'. Каков ваш * реальный * код, который делает с данными после удаления чего-либо из него? –

+0

Пожалуйста, разместите * полное * исключение, включая его стек вызовов и фактический код, где он встречается. Нет необходимости отбрасывать буферные данные. Это * не * буфер, который вызывает проблемы, но как вы обрабатываете строки, которые вы читаете. –

+0

Я не думаю, что 'DiscardBufferedData' делает то, что вы думаете. Он используется только для повторной синхронизации Reader и базового потока. Вы пробовали это без дополнительного вызова метода? – hometoast

ответ

1

Вы можете использовать методы из класса FileStream: FileStream.Read и FileStream.Seek должны позволить вам делать то, что вам нужно. Пример можно найти здесь: http://www.codeproject.com/Questions/543821/ReadplusBytesplusfromplusLargeplusBinaryplusfilepl

Вам придется немного изменить это значение, но по существу вы можете начинать с 0, читать, пока не найдете символ новой строки, обработайте линию, начните с того места, где вам нужно, и повторите. Это не будет ужасно эффективно, но он выполнит свою работу.

Надеюсь, это поможет.

+0

Да, правильно, что несколько модификаций я могу читать по строкам. –

+0

Все, что вы делаете, пытается изобрести колесо. 'StreamReader' уже делает это, довольно хорошо. Вероятность того, что вы воспользуетесь кодом замены для StreamReader, очень высока. (Для двоичных файлов вы не должны использовать 'StreamReader', очевидно) – MicroVirus

+0

Согласны, в идеальном мире вы бы использовали StreamReader. К сожалению, по какой-то причине это не работает здесь ... Для чего-то такого же простого, как чтение строки за строкой, я не уверен, что риск «прикручивания» чего-то был бы достаточно высоким, чтобы лишить меня возможности использовать это решение лично, но другие могут иметь разные мнения. – Filint

Смежные вопросы