2013-02-25 6 views
2

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

public static byte[] GetBytesFromFile(string fullFilePath) 
{ 
    FileStream fs = File.OpenRead(fullFilePath); 
    try 
    { 
     byte[] bytes = new byte[fs.Length]; 
     fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
     fs.Close(); 
     return bytes; 
    } 
    finally 
    { 
     fs.Close(); 
    } 
} 

Через несколько часов я получаю System.OutOfMemoryException. Я делаю что-то неправильно здесь?

Update: Я использую возвращаемые байты в этом коде:

object s = null; 
System.Reflection.Assembly a = Assembly.Load(bytes); 
object o = a.CreateInstance("ID_" + report.ID.ToString().Replace("-", "_")); 

Type t = o.GetType(); 
MethodInfo mi = t.GetMethod(name); 
object[] values = new object[1]; 
values[0] = nameValue; 
s = mi.Invoke(o, values); 
return s; 
+3

СОВЕТ. Используйте с помощью() блок по типу FileStream. Таким образом, не требуется окончательный или явно закрытый вызов. – Zenwalker

+0

Размер файла чтения постоянный или время от времени меняется? – Zenwalker

+0

Насколько велик файл, который вы пытаетесь прочитать? – ryadavilli

ответ

4

С редактированием, проблема очевидна:

System.Reflection.Assembly a = Assembly.Load(bytes); 

Вот вещь: сборки не делают выгрузить от AppDomain. Есть некоторые вещи для сбора мусора, такие как DynamicMethod - но не полная сборка. Если вы загружаете сборки, единственный безопасный способ сделать это - это отдельный AppDomain в этом процессе. Затем вы можете сбрасывать AppDomain, когда вы закончите с ним (что выгружает все, что в нем).


На самом деле, нет никакой гарантии, что ваш существующий код даже работает - Read делает не гарантии, чтобы прочитать все данные. У меня есть ожидающий сообщение в блоге об этом ...

Но: если файлы большие, вполне вероятно, что вы медленно насыщаете LOH, который является неуплотняющейся кучей. Лучший совет, который я могу предложить, - это: не читать огромные файлы в массивы. Попробуйте переписать код нисходящего кода для работы с API Stream, каким-то «читающим» API или каким-то разным блоком итератора синтаксического анализа.

Не видя, как остальная часть кода обрабатывает вещи, трудно сказать больше. Однако было бы неплохо запустить профилировщик памяти в коде, чтобы подтвердить, что это действительно byte[], которые вызывают проблемы с памятью.

+0

Что именно вы имеете в виду с «насыщением»? Фрагментация? – CodesInChaos

+0

@Marc, размер моих файлов составляет около 4 КБ. Когда я использую инструмент VMMap, частные данные постоянно растут, а загрузка процессора составляет около 2%. Я обновил сообщение, чтобы показать, где я использую возвращенные байты. Не могли бы вы предоставить пример кода для лучшего способа его реализации? – PSR

+0

LOH = _Barge Object Heap_, специальная куча, которая не является сборкой мусора для объектов размером более 83 KiB. – Virtlink

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