2013-03-25 2 views
0

Позвольте мне объяснить, что мне нужно для достижения. Мне нужно загрузить файл в ОЗУ и проанализировать его структуру. То, что я делаю это:C# массив для поддержки поддержки архитектуры файлов страниц

//Stream streamFile; 

byte[] bytesFileBuff = new byte[streamFile.Length]; 
if(streamFile.Read(bytesFileBuff, 0, streamFile.Length) == streamFile.Length) 
{ 
    //Loaded OK, can now analyze 'bytesFileBuff' 
    //Go through bytes in 'bytesFileBuff' array from 0 to `streamFile.Length` 
} 

Но в моем previous experience с Windows, и 32-разрядные процессы, похоже, даже меньшего количества оперативной памяти может быть трудно выделить. (В этом конкретном примере мне не удалось выделить 512 МБ на компьютере под управлением Windows 7 с 16 ГБ установленной оперативной памяти.)

Мне было любопытно, есть ли специальный класс, который позволил бы мне работать с содержимым в файле гипотетически любой длины (путем реализации внутреннего аналога архитектуры файла страниц)?

+0

ли в вашем анализ требует произвольного доступа к файлу? или вы можете сделать это линейно? Даже если вам нужно несколько проходов, с большими файлами вам всегда лучше обрабатывать его как поток. –

+0

@EuroMicelli: Да, я тоже склоняюсь к использованию потоков. Слишком сложно работать с ними (или, я бы сказал, не так просто, как с байтовым массивом). – c00000fd

ответ

2

Если линейный доступ к потоку (даже с несколькими проходами) не является жизнеспособным вариантом, решением в Win32 было бы использовать файлы с памятью с относительно небольшими видами.

Я не думал, что вы можете сделать это на C# легко, но я был неправ. Оказывается, что .NET 4.0 и выше предоставляют классы, переносящие API Mapped Files.

См http://msdn.microsoft.com/en-us/library/dd997372.aspx

Если вы использовали память отображенные файлы в C/C++, вы будете знать, что делать.

Основная идея заключается в использовании MemoryMappedFileCreateFromFile для получения объекта MemoryMappedFile. С помощью объекта вы можете вызвать метод CreateViewAccessor, чтобы получить разные объекты MemoryMappedViewAccessor, представляющие куски файла; вы можете использовать эти объекты для чтения из файла в кусках по вашему выбору. Убедитесь, что вы аккуратно распоряжаетесь MemoryamappedViewAccessors, чтобы освободить буфер памяти.

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

(Как я уже сказал, я не знал об этих классах обертках в .NET ли внимательно читать документы MSDN:. Я мог бы легко упустить что-то важное в течение нескольких минут я провел рассматривающие их)

+0

Очень приятная находка. Благодарю. – c00000fd

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