Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив с Memory-Mapped file, возможно ли это в C# 
:(
    Опции темы
Kronos
Дата 26.6.2005, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.9.2002
Где: Млечный Путь

Репутация: нет
Всего: нет



возможно ли это в C#

Задача. Задать большой массив скажем double[10 000 000]. При этом данные хранятся в файле в бинарном виде. Самый простой вариант считать их оттуда в буфер памяти (прямо сразу в массив). Это работает.

Но есть и другой вариант. Это должно работать на обычном С++. Создать Memory-mapped file и сделать отображение файла на адресное пространство буфера. Тогда считывание данных и их "кэширование" будет производится только по факту обращения к элементам массива.

Как мне кажется такое пройдет и в .NET (скажу честно, еще не проверял). Естественно отображение и все такое надо также осуществлять в unsafe. Но вот проблема. При выходе из блока unsafe, .NET имеет право перемещать положение объектов (и нашего массива в том числе) в адресном пространстве. Тогда как отображенное пространство должно будет оставаться на одном месте постоянно. Вроде необходима явная поддержка memory-mapped files со стороны .NET. В MSDN ничего не нашел (плохо искал?). Ведь такой эффективный механизм.

Итак. Есть ли его реализация. Если нет изначально. То можно ли осуществить теоретически (обычному программисту создать такой класс). Тут как то придется управлять сборщиком мусора (который дефрагментирует объекты и вызывает их перемещение в адресном пространстве).


PM MAIL   Вверх
mr.DUDA
Дата 26.6.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Можно использовать винапишные ф-ции для работы с memory mapped file, но это долго и муторно, и нужно делать unsafe проект.

Ещё, поищи в сети информацию о Microsoft.ApplicationBlocks.MemoryMappedFile.dll, у меня сейчас нет возможности выложить саму длл-ку, т.к. она лежит на работе, а с microsoft.com можно выкачать только Enterprise Library целиком (доступ есть только зарегистрированным юзерам).


--------------------
user posted image
PM MAIL WWW   Вверх
Kronos
Дата 26.6.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.9.2002
Где: Млечный Путь

Репутация: нет
Всего: нет



Цитата(mr @ 26.6.2005, 09:25)
Можно использовать винапишные ф-ции для работы с memory mapped file, но это долго и муторно, и нужно делать unsafe проект


Об этом я примерно и говорил. Проблема в том, что при выходе из unsafe блока (и из блока fixed соответственно) такой массив становится неюзабельным. Его адрес мржет изменится, при этом адрес отображенной области синхронно не изменится.
PM MAIL   Вверх
mr.DUDA
Дата 26.6.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Kronos @ 26.6.2005, 12:51)
Проблема в том, что при выходе из unsafe блока (и из блока fixed соответственно) такой массив становится неюзабельным.

Так, если я правильно понял, все операции над отображаемым файлом можно выполнить в рамках unsafe блока. Если же что-то нужно вернуть (типа фрагмент массива и т.п.), можно скопировать это "что-то" в обычный массив или переменную. Где тут проблема ?



--------------------
user posted image
PM MAIL WWW   Вверх
Kronos
Дата 26.6.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.9.2002
Где: Млечный Путь

Репутация: нет
Всего: нет



Цитата(mr @ 26.6.2005, 13:29)
Так, если я правильно понял, все операции над отображаемым файлом можно выполнить в рамках unsafe блока. Если же что-то нужно вернуть (типа фрагмент массива и т.п.), можно скопировать это "что-то" в обычный массив или переменную. Где тут проблема ?


Конечно можно и копировать. Вопрос лишь в производительности. Хотелось бы избежать копирования скажем сотни мегабайт памяти.

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

Конечно впоследствии после явного копирования массив вероятно все равно сбросится в файл подкачки. Но все равно операция явного копирования большой области памяти выглядит лишней и занимает время. А если придется работать с кучей массивов в цикле и по логике программы всего лишь необходимо вносить изменения в пару элементов каждого массива (но каких, заранее неизвестно)?
PM MAIL   Вверх
mr.DUDA
Дата 26.6.2005, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Kronos @ 26.6.2005, 20:12)
А если придется работать с кучей массивов в цикле и по логике программы всего лишь необходимо вносить изменения в пару элементов каждого массива (но каких, заранее неизвестно)?

Подожди. В рамках одного метода известно, какие именно ячейки массива должны быть обработаны/возвращены, правильно ? Вот их и обрабатывай в unsafe-блоке. Зачем копировать большие блоки памяти туда-сюда, если реально обработке подвергаются только избранные блоки памяти ?


--------------------
user posted image
PM MAIL WWW   Вверх
Guest
Дата 27.6.2005, 08:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(mr @ 26.6.2005, 22:22)
Подожди. В рамках одного метода известно, какие именно ячейки массива должны быть обработаны/возвращены, правильно ? Вот их и обрабатывай в unsafe-блоке. Зачем копировать большие блоки памяти туда-сюда, если реально обработке подвергаются только избранные блоки памяти ?


Ну нет. это при каждом обращении к элементу массива строить отображение и входить в unsafe? Какие интересно будут потери в производительности, тогда как именно из-за производительности все это затевалось. Да и не совсем удобно это.
  Вверх
mr.DUDA
Дата 27.6.2005, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата
Ну нет. это при каждом обращении к элементу массива строить отображение и входить в unsafe? Какие интересно будут потери в производительности, тогда как именно из-за производительности все это затевалось. Да и не совсем удобно это.

Я не это имел ввиду. Обработка отображаемого файла может быть целиком помещена в отдельный метод, работающий в unsafe.

Вот, нашёл у себя майкрософтовский MemoryMappedFile, выкладываю.

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  Microsoft.ApplicationBlocks.MemoryMappedFile.zip 6,46 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Guest
Дата 27.6.2005, 10:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(mr @ 27.6.2005, 09:24)
Я не это имел ввиду. Обработка отображаемого файла может быть целиком помещена в отдельный метод, работающий в unsafe.


С трудом понимаю. С массивом придется работать много и в разных частях программы. Придется все функции объявлять unsafe и вероятно возникнут сложности с использованием fixed(){} (без него вроде не обойтись). В общем не уверен.

Цитата(mr @ 27.6.2005, 09:24)
Вот, нашёл у себя майкрософтовский MemoryMappedFile, выкладываю.

Спасибо. Посмотрю.

  Вверх
mr.DUDA
Дата 27.6.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Guest @ 27.6.2005, 10:32)
С трудом понимаю. С массивом придется работать много и в разных частях программы. Придется все функции объявлять unsafe и вероятно возникнут сложности с использованием fixed(){} (без него вроде не обойтись). В общем не уверен.

Ну, если задача стоит таким образом, то без нескольких unsafe действительно не обойтись.


--------------------
user posted image
PM MAIL WWW   Вверх
Kronos
Дата 28.6.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.9.2002
Где: Млечный Путь

Репутация: нет
Всего: нет



Цитата(mr @ 27.6.2005, 06:24)
Вот, нашёл у себя майкрософтовский MemoryMappedFile, выкладываю.


Документацию на эту dll я не нашел. Даже на сайте microsoft. Все что находится - нечто левое.
Есть ли такая документация в том пакете, в котором, как ты говорил, содержалась эта dll?

Я так понимаю это библиотека .NET?

PM MAIL   Вверх
mr.DUDA
Дата 28.6.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Kronos @ 28.6.2005, 20:32)
Документацию на эту dll я не нашел. Даже на сайте microsoft. Все что находится - нечто левое.

The patterns & practices Enterprise Library is a library of application blocks designed to assist developers with common enterprise development challenges. Application blocks are a type of guidance, provided as source code that can be used "as is," extended, or modified by developers to use on enterprise development projects. Enterprise Library features new and updated versions of application blocks that were previously available as stand-alone application blocks. All Enterprise Library application blocks have been updated with a particular focus on consistency, extensibility, ease of use, and integration.

На сайте есть download всей библиотеки, судя по всему, с хелпом (т.к. занимает 8 Мб). Отдельно скачать MMF можно по ссылке:
http://download.microsoft.com/download/b/2...ion%20Block.msi

Там есть полные исходники длл и кое-какая документация.




--------------------
user posted image
PM MAIL WWW   Вверх
nikf
Дата 29.6.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



Мутишь чего-то:
Цитата
Конечно можно и копировать. Вопрос лишь в производительности. Хотелось бы избежать копирования скажем сотни мегабайт памяти.

Цитата
А если придется работать с кучей массивов в цикле и по логике программы всего лишь необходимо вносить изменения в пару элементов каждого массива (но каких, заранее неизвестно)?
ты уж определись, сотни мегов или пара элементов по 8 байт...
если пару елементов - копируй изменяй и записывай обратно.. а про производительность :могу поспорить что решив задачу с отображаемыми файлами ты не заметишь прироста производительности - только время потратишь.. кстати твои 80мегов можешь копировать в память целиком и они
Цитата
сбросится в файл подкачки.
только если только у тя 125 мегов оперативки и параллелно адоб премьер видеофильм сжимает... ИМХО не парься smile
PM MAIL   Вверх
arilou
Дата 30.6.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Guest @ 27.6.2005, 10:32)
С трудом понимаю. С массивом придется работать много и в разных частях программы.

А почему бы не создать класс-обертку вокруг твоих операций над MMF и юзать его "в разных частях программы"? Пусть его члены будут unsafe. Такой паттерн называется "facade", и даст тебе возможность отказаться от MMF, если он тебе все таки не подойдет, не меняя остальную часть программы.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1179 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.