У меня есть задача по исправлению/улучшению программы, которая у нас есть, и постоянно бросает исключения OOM при обработке больших файлов (60-90 МБ) в памяти. Эта программа, по сути, в домашнем решении для перемещения файлов из нашей инфраструктуры в клиент SFTP и наоборот. < /P> Описание высокого уровня < /strong>:
перемещение в форме файлов, содержащих данные о платежах. Данные о платежах токенизированы с нашей стороны и должны быть некрашены, когда он достигает клиента SFTP или, если мы перемещаем файл из клиента, то данные не раздираются на их конце, и мы должны направить информацию о платеже перед созданием и хранением этих данных в качестве файла С нашей стороны. Таким образом, правило, которое мы должны соблюдать, заключается в том, что оно должно загружать весь файл в память (мы не можем скопировать его в файл, временный или иной), токенизировать/декорировать его в памяти, а затем натолкнуть эти данные из памяти к клиентскому SFTP в прозрачном тексте или Храните на нашем конце в токенизированной форме. Ни при каких обстоятельствах нам не разрешается хранить файл с данными с четким текстовым платежом на нашем конце. , цикл через этот массив, собирая информацию о платежах, а затем отправляет эту платежную информацию в API токенизации в качестве еще одного массива значений (у нас нет возможности разыграть процесс или частично загружать файлы в данный момент), а затем преобразует результат в память и сохраняет Он в файл (с токеновыми данными о платежах) или загружает его в SFTP (с непредвиденными данными о прозрачном текстовом платеже). Теперь проблема заключается в том, что приложение раньше бросало OOM при обработке файла 90 МБ. Я несколько улучшил код и при составлении приложения (скомпилированном как x86, не может компилироваться как x64 по нескольким причинам). Я также использовал исправление editbin.exe /largeaddressaware < /code> в исполняемом файле приложения, чтобы он обрабатывал адреса более 2 ГБ. Полем Я, вероятно, мог бы сделать больше улучшений кода, но наши серверы, которые запускают приложение, имеют 16 или более концертов оперативной памяти, и, похоже, не исчерпаны оперативной памяти при обработке файлов. Кроме того, когда я работаю на местном уровне, у меня такие же проблемы с OOM, и я все еще имею около 40% бесплатной оперативной памяти. Чтение немного по этой теме заставляет меня чувствовать, что это ограничение инфраструктуры X86 и/или .NET .NET. Это происходит, когда мы пытаемся преобразовать весь файл (в качестве строителя строки) в массив байтов, которые будут сохранены в виде файловой системы.text.encoding.utf8.getbytes (sb.tostring ())
Исключение < /strong>:
достаточно странно, мы получаем 2 типа исключений, иногда это простое исключение OOM: < /p>
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.IO.MemoryStream.set_Capacity(Int32 value)
at System.IO.MemoryStream.EnsureCapacity(Int32 value)
at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at xxxxx.ToMemoryStream()
или иногда этот странный, который закрывает приложение, полностью игнорируя любые Try/Catings:
The runtime has encountered a fatal error. The address of the error was at 0x73aa2847, on thread 0x5070. The error code is 0xe0004743. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
< /code>
Вопрос < /strong>:
Есть ли более надежный способ загрузить вещи в память и не ограничиваться инфраструктурой x86 или .NET без разбивания данных или Загрузка частично? Я чувствую, что с 4-8 ГБ, доступной оперативной памяти, мы не должны заканчиваться при загрузке файла 150 МБ в память. Похоже, есть и другие способы загрузки вещей в память, такие как память или память, но прежде чем тратить какое -либо значительное время на изучение всех возможностей, которые я подумал о том, чтобы спросить это полезное сообщество для любых направлений, на которых я должен сосредоточиться. < /P>
< P> Tech Используется < /strong>:
c#, .net Framework 4.5.2 < /p>
Спасибо < /p>
Ps [/b]: Когда это приложение запускается, его следование ОЗУ обычно составляет около 2-3 концертов, и, как я упоминал ранее, будь то работа на локальном или на соответствующем сервере, часто есть еще один 4-8 концертов ОЗУ, когда приложение доступно, когда приложение доступно, когда приложение доступно. Запускает OOM.public MemoryStream ToMemoryStream()
{
MemoryStream ms = new MemoryStream();
//byte[] msBuffer;
var sb = new StringBuilder();
foreach (var section in Lines.Values)
{
var sec = section.ToString();
if (sec.Contains("\n"))
sb.Append(sec);
else
sb.AppendLine(sec);
if (sb.Length
Прокомментированные вещи - мои улучшения в функции. Ранее это создавало бы по сути еще одну копию файла (уже содержащейся в объекте Lines
) путем постоянного добавления в SB String Builder, а затем создав другую копию, преобразив в массив байтов и присвоив MSBuffer, а затем еще один Копировать - это фактический объект MemoryStream, который был возвращен. Файл. edit: , пока нет четкого решения моей проблемы, то, что помогло знать размер файла заранее и распределить столько памяти сразу, когда Создание MemoryStream помогло достаточной сумме (примерно на 20%). Спасибо за это предложение, ralf
У меня есть задача по исправлению/улучшению программы, которая у нас есть, и постоянно бросает исключения OOM при обработке больших файлов (60-90 МБ) в памяти. Эта программа, по сути, в домашнем решении для перемещения файлов из нашей инфраструктуры в клиент SFTP и наоборот. < /P> [b] Описание высокого уровня < /strong>: перемещение в форме файлов, содержащих данные о платежах. Данные о платежах токенизированы с нашей стороны и должны быть некрашены, когда он достигает клиента SFTP или, если мы перемещаем файл из клиента, то данные не раздираются на их конце, и мы должны направить информацию о платеже перед созданием и хранением этих данных в качестве файла С нашей стороны. Таким образом, правило, которое мы должны соблюдать, заключается в том, что оно должно загружать весь файл в память (мы не можем скопировать его в файл, временный или иной), токенизировать/декорировать его в памяти, а затем натолкнуть эти данные из памяти к клиентскому SFTP в прозрачном тексте или Храните на нашем конце в токенизированной форме. Ни при каких обстоятельствах нам не разрешается хранить файл с данными с четким текстовым платежом на нашем конце. , цикл через этот массив, собирая информацию о платежах, а затем отправляет эту платежную информацию в API токенизации в качестве еще одного массива значений (у нас нет возможности разыграть процесс или частично загружать файлы в данный момент), а затем преобразует результат в память и сохраняет Он в файл (с токеновыми данными о платежах) или загружает его в SFTP (с непредвиденными данными о прозрачном текстовом платеже). Теперь проблема заключается в том, что приложение раньше бросало OOM при обработке файла 90 МБ. Я несколько улучшил код и при составлении приложения (скомпилированном как x86, не может компилироваться как x64 по нескольким причинам). Я также использовал исправление editbin.exe /largeaddressaware < /code> в исполняемом файле приложения, чтобы он обрабатывал адреса более 2 ГБ. Полем Я, вероятно, мог бы сделать больше улучшений кода, но наши серверы, которые запускают приложение, имеют 16 или более концертов оперативной памяти, и, похоже, не исчерпаны оперативной памяти при обработке файлов. Кроме того, когда я работаю на местном уровне, у меня такие же проблемы с OOM, и я все еще имею около 40% бесплатной оперативной памяти. Чтение немного по этой теме заставляет меня чувствовать, что это ограничение инфраструктуры X86 и/или .NET .NET. Это происходит, когда мы пытаемся преобразовать весь файл (в качестве строителя строки) в массив байтов, которые будут сохранены в виде файловой системы.text.encoding.utf8.getbytes (sb.tostring ()) Исключение < /strong>: достаточно странно, мы получаем 2 типа исключений, иногда это простое исключение OOM: < /p> [code] System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.IO.MemoryStream.set_Capacity(Int32 value) at System.IO.MemoryStream.EnsureCapacity(Int32 value) at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) at xxxxx.ToMemoryStream() [/code] или иногда этот странный, который закрывает приложение, полностью игнорируя любые Try/Catings: [code]The runtime has encountered a fatal error. The address of the error was at 0x73aa2847, on thread 0x5070. The error code is 0xe0004743. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack. < /code> Вопрос < /strong>: Есть ли более надежный способ загрузить вещи в память и не ограничиваться инфраструктурой x86 или .NET без разбивания данных или Загрузка частично? Я чувствую, что с 4-8 ГБ, доступной оперативной памяти, мы не должны заканчиваться при загрузке файла 150 МБ в память. Похоже, есть и другие способы загрузки вещей в память, такие как память или память, но прежде чем тратить какое -либо значительное время на изучение всех возможностей, которые я подумал о том, чтобы спросить это полезное сообщество для любых направлений, на которых я должен сосредоточиться. < /P> < P> Tech Используется < /strong>: c#, .net Framework 4.5.2 < /p> Спасибо < /p> Ps [/b]: Когда это приложение запускается, его следование ОЗУ обычно составляет около 2-3 концертов, и, как я упоминал ранее, будь то работа на локальном или на соответствующем сервере, часто есть еще один 4-8 концертов ОЗУ, когда приложение доступно, когда приложение доступно, когда приложение доступно. Запускает OOM.public MemoryStream ToMemoryStream() { MemoryStream ms = new MemoryStream(); //byte[] msBuffer; var sb = new StringBuilder();
foreach (var section in Lines.Values) { var sec = section.ToString();
if (sec.Contains("\n")) sb.Append(sec); else sb.AppendLine(sec);
if (sb.Length Прокомментированные вещи - мои улучшения в функции. Ранее это создавало бы по сути еще одну копию файла (уже содержащейся в объекте Lines [/code]) путем постоянного добавления в SB String Builder, а затем создав другую копию, преобразив в массив байтов и присвоив MSBuffer, а затем еще один Копировать - это фактический объект MemoryStream, который был возвращен. Файл. [b] edit: [/b], пока нет четкого решения моей проблемы, то, что помогло знать размер файла заранее и распределить столько памяти сразу, когда Создание MemoryStream помогло достаточной сумме (примерно на 20%). Спасибо за это предложение, ralf
У меня есть задача исправить/улучшить программу, которая у нас стоит и постоянно выдает исключения OOM при обработке больших файлов (60-90Мб) в памяти. По сути, эта программа представляет собой собственное решение для перемещения файлов из нашей...
У меня есть задача исправить/улучшить программу, которая у нас стоит и постоянно выдает исключения OOM при обработке больших файлов (60-90Мб) в памяти. По сути, эта программа представляет собой собственное решение для перемещения файлов из нашей...