Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileMapping 
:(
    Опции темы
Micher
  Дата 21.11.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



Я тут как то на форуме спрашивал, как 2 процесса оперировать данными через оперативку(так быстрее, чем через файл). Многие посоветовали юзать FileMapping. Я не вдаваясь в теорию, написал код. Сейчас нашёл такое:

---
FileMapping - записывает данные на жеский диск в файл подкачки

Под "памятью" в Windows подразумевается не только физическая память (ОЗУ), но также память, резервируемая операционный системой на жестком диске. Этот вид памяти называется "виртуальной памятью" и образует так называемый страничный свап-файл или "файл подкачки". По мере необходимости операционная среда обращается к этому файлу, чтобы поместить в него пока ненужные системе данные или наоборот считать в ОЗУ уже потребовавшиеся данные (как все это система делает надо спросить у Билла Гейтса). Но, не вдаваясь в подробности реализации страничных файлов подкачки, мы можем использовать эту особенность Windows в своих интересах. Например, поместить каким-то способом в свап-файл нужные уже НЕ СИСТЕМЕ, А НАМ данные, чтобы затем можно было бы обратиться к этому файлу из любого другого процесса и считать или изменить нужные данные. К счастью, WinAPI предоставляет способ работы со свап-файлом посредством так называемого объекта файлового отображения.
---

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

Спасибо
PM MAIL   Вверх
bems
Дата 21.11.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Micher @  21.11.2008,  12:35 Найти цитируемый пост)
Т.е. я так понимаю FileMapping этот тоже самое что работать через файл? Или я не прав?
не прав. Когда ты просишь память у системы с помощью VirtualAlloc (а rtl делфы делает это неявно при выделении памяти для последующих вызовов GetMem и других дельфовых функций), так вот при VirtualAlloc ты получаешь кусок виртуальной памяти, которая когда тебе нужно лежит в оперативе, а когда место в оперативе нужно кому-то другому выгружается в страничный файл. Таким образом при работе с памятью _всегда_ есть некоторая вероятность того, что будет использован файл подкачки (и, да, это замедляет работу). FileMapping позволяет создать область памяти, которая будет при необходимости выгружаться в файл, который укажешь ты (или в тот же файл подкачки если указать спец. значение вместо дескриптора файла). Вот и получается, что с одной стороны даже то что для тебя выглядит как оператива, может быть медленным, как дисковый файл, а с другой стороны там где ты сам указываешь файл все может работать быстро, как в оперативной памяти.

При использовании FileMapping винда сама решает когда юзать дисковый файл, а когда обойтись буфером в памяти (и не так уж глупо решает), а при простой работе с файлми ты вынужден делать много телодвижений сам. 
Как вообще ты собрался обмениваться данными через файлы? 

Я вижу это так: в обоих процессах ты откраваешь один и тот же файл. В первом процессе что-то туда пишеш. Если сразу же попробовать прочитать в другом процессе, то результат зависит от того были ли сброшены данные из виндового буфера на диск (а это зависит от многих факторов). Чтобы убедиться что запись в файл реально была, нужно вызвать FlushFileBuffers, что уже стопроцентно медленно. А в случае FileMapping винда может избежать этого обращения к диску (хотя где-то внутри и будет помнить, что когда-нибудь ей придется скинуть данные в файл).

В общем юзай файлмаппинги



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Micher
Дата 21.11.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

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



2 программы обмениваются просто. Первая пишет в один FileMapping, 2-я во 2-й. Первая читает из 2-ого и наоборот. Ну и там какие то операции совершают в зависимости от данных
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




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


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

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