Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Файлы, отображаемые в память.  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
Ежов Дмитрий Сергеевич
Мне надо, чтобы файлик записался, даже несмотря на то, что процесс умер.


MMF для этого не предназначен, и не сможет такого гарантировать.
Гарантия записи при смерти юзер процесса появляется после закрытия системного хэндла (HFILE).

Если нужно гарантировать - закрывайте файл (все хэндлы) и открывайте заново. По-другому мне неизвестно.

MMF был первоначально сделан для внутренних нужд Винды, и оптимизации там касаются в основном чтения.
12 ноя 20, 20:16    [22231078]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
Vizit0r
насколько я помню из результатов изначального сравнения - MMF дает большой прирост к скорости непоследовательного чтения
Зависит от того, какими блоками читать. Если по одному байту, то дает, а если по 4096 байт, то выигрыша вообще нет. Т.е. сама операция чтения проходит быстрее, но для MMF тратится куча времени на вызов MapViewOfFile
12 ноя 20, 21:11    [22231109]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
Ежов Дмитрий Сергеевич
мммм, неумирающий серверный процесс в сложных системах, без утечек памяти и кривых сторонних компонентов и кривого легаси от девопса. Что может быть естественней...
Вы не поверите, но у нас именно такие процессы и пишутся
12 ноя 20, 21:12    [22231110]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 855
_Vasilisk_
Vizit0r
насколько я помню из результатов изначального сравнения - MMF дает большой прирост к скорости непоследовательного чтения
Зависит от того, какими блоками читать. Если по одному байту, то дает, а если по 4096 байт, то выигрыша вообще нет. Т.е. сама операция чтения проходит быстрее, но для MMF тратится куча времени на вызов MapViewOfFile

по паре кб, но в разных местах файла, и часто-частно.
12 ноя 20, 22:24    [22231137]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
Vizit0r,

а файл, меньше двух гигов, и не sparse?
12 ноя 20, 22:45    [22231141]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
Vizit0r
_Vasilisk_

Зависит от того, какими блоками читать. Если по одному байту, то дает, а если по 4096 байт, то выигрыша вообще нет. Т.е. сама операция чтения проходит быстрее, но для MMF тратится куча времени на вызов MapViewOfFile

по паре кб, но в разных местах файла, и часто-частно.


В этом случае ММФ должен рулить, особенно если working set небольшой.
Работа с памятью намного привычнее и удобнее чем seek/read, и ММФ не требует загрузки всего файла в память.

Без ММФ, если вы выделите массив, и прочитаете туда весь файл чтоб получить удобства памяти, этот массив все равно будет участвовать в ММФ без вашего ведома, только не с первоначальным файлом, а с pagefile. И тогда может оказаться медленнее, т.к. выгрузка в pagefile требует запись на диск, а read-only MMF просто выкидывает старые страницы и читает их заново из оригинала.
12 ноя 20, 22:54    [22231146]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
НеофитSQL
ММФ не требует загрузки всего файла в память.
Требует. Для вас это сюрприз?

Вызовите MapViewOfFile для 100 мегабайт и посмотрите не время візова и на потребляемую память
13 ноя 20, 10:48    [22231277]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4724
_Vasilisk_,

MMF поднимает в память только те данные, к которым происходит обращение. Кроме того, поднятые в память страницы в любой момент могут быть отданы системе, если будет такая необходимость. Если ты последовательно прошелся по всему файлу, то, в зависимости от условий выполнения, в рабочем наборе приложения может быть полный набор страниц файла, но это не то же самое, что выделить буффер и засосать в него весь файл.
13 ноя 20, 11:39    [22231318]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
Kazantsev Alexey
MMF поднимает в память только те данные, к которым происходит обращение
Открой диспетчер задач и посмотри на потребление памяти.

Я когда-то проводил опыты по чтению файла разными кусками и разными способами
13 ноя 20, 12:39    [22231359]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4724
_Vasilisk_,

Рихтера перечитай.

з.ы. Показания диспетчера нужно ещё правильно интерпретировать.
13 ноя 20, 12:49    [22231364]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 855
НеофитSQL
Vizit0r,

а файл, меньше двух гигов, и не sparse?

файлы в районе 100-150 мб, а sparce - это имееется в виду фрагментированность? Если да, то специальной дефрагментацией никто не заморачивается, ни я, ни тем более пользователи.
13 ноя 20, 12:50    [22231366]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
Vizit0r
НеофитSQL
Vizit0r,

а файл, меньше двух гигов, и не sparse?

файлы в районе 100-150 мб, а sparce - это имееется в виду фрагментированность? Если да, то специальной дефрагментацией никто не заморачивается, ни я, ни тем более пользователи.


Sparse file - это файлы с дырками, для которых не отведено место на диске. Например, в первом килобайте есть данные, в 100500 килобайте есть данные, а между ними нет ничего, и места на диске не занимает. Дырка при чтении даст нули, а при записи начнет аллокировать кластеры диска, или какие там у конкретной системы единицы аллокации.

Если у вас таких файлов нет, то это не ваш головняк. Фрагментация диска на работу ММФ не влияет, 200МБ позволяет легко работать хоть из 32-бит, хоть из 64
13 ноя 20, 17:44    [22231607]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
_Vasilisk_
Kazantsev Alexey
MMF поднимает в память только те данные, к которым происходит обращение
Открой диспетчер задач и посмотри на потребление памяти.

Я когда-то проводил опыты по чтению файла разными кусками и разными способами


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

для ММФ немедленно выделяется виртуальное пространство (интервал адресов) из пространства процесса.
Сколько начально поднимается с диска, зависит от оптимизаций в конкретной версии винды, возможно где-то описано, я уже не помню.

Вы можете это легко проверить, применив ММФ к файлу больше, чем количество свободной физической памяти на компе.
13 ноя 20, 17:50    [22231613]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3731
в копилку еще вариант (MappedFile.zip):
https://www.nzlab.dk/codesnippets/codesnippets.htm
14 ноя 20, 11:19    [22231953]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
Kazantsev Alexey
_Vasilisk_,

Рихтера перечитай.

з.ы. Показания диспетчера нужно ещё правильно интерпретировать.
Шо там интерпретиовать. Открыть файл на 2 гига в 32-бит программе и пробежаться по нему (хэш посчитать, например). Будет OOM.
14 ноя 20, 14:51    [22232053]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
YuRock
Kazantsev Alexey
_Vasilisk_,
з.ы. Показания диспетчера нужно ещё правильно интерпретировать.
Шо там интерпретиовать. Открыть файл на 2 гига в 32-бит программе и пробежаться по нему (хэш посчитать, например). Будет OOM.

Открыть - это как? Сделать ему MapView на весь объём?.. А зачем, если можно по частям?
14 ноя 20, 16:22    [22232084]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4724
YuRock
Шо там интерпретиовать.

Что там интерпретировать... А потом начинают путать адресное пространство с выделяемой памятью.
14 ноя 20, 16:34    [22232088]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
alekcvp
Открыть - это как? Сделать ему MapView на весь объём?
Да.
alekcvp
А зачем, если можно по частям?
В данном случае - для эксперимента. Чтобы убедиться, что не получится видеть только необходимое, открыв всё.
А вообще, могло бы быть полезно для удобства - для передачи в функцию, которая принимает указатель на память и размер. Например, в виндовую CryptHashData.
Было бы прикольно, если бы винда держала бы в памяти только нужный блок, по которому идут обращения. Ну это так - мечты, мечты. Понятно, что это невозможно, т.к. винда знать не знает об этих обращениях.
16 ноя 20, 07:30    [22232582]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
YuRock

А вообще, могло бы быть полезно для удобства - для передачи в функцию, которая принимает указатель на память и размер. Например, в виндовую CryptHashData.
Было бы прикольно, если бы винда держала бы в памяти только нужный блок, по которому идут обращения. Ну это так - мечты, мечты. Понятно, что это невозможно, т.к. винда знать не знает об этих обращениях.

1. Так 2 гига - это лимит на размер памяти в x86 винде, если без плясок с бубном. Как ты его весь под файл отдашь?..
2. Ну как бы через ReadFile() ты такое тоже не вычитаешь, т.е. не вижу тут никаких недостатков перед ним.

Сообщение было отредактировано: 16 ноя 20, 10:45
16 ноя 20, 10:48    [22232678]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4724
YuRock
Понятно, что это невозможно, т.к. винда знать не знает об этих обращениях.

Винда-то, как раз, знает. Без этого знания не работал бы пейджинг. В таск менеджере даже счётчик соответствующий есть, Page Faults называется.
16 ноя 20, 13:43    [22232887]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5768
ЕМНИП, при стандартном чтении менеджер кэша винды создает секции читаемого файла по 256кб. Это тоже mmf. Как и исполняемые файлы, и динамические библиотеки и пр.
В книжке Руссиновича все это есть.
16 ноя 20, 14:56    [22232978]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
alekcvp
Так 2 гига - это лимит на размер памяти в x86 винде
Спасибо, кэп.
alekcvp
через ReadFile() ты такое тоже не вычитаешь, т.е. не вижу тут никаких недостатков перед ним
Я не недостатки искал, а мечтал о преимуществах.
16 ноя 20, 15:20    [22233007]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4339
Kazantsev Alexey
YuRock
Понятно, что это невозможно, т.к. винда знать не знает об этих обращениях.

Винда-то, как раз, знает. Без этого знания не работал бы пейджинг. В таск менеджере даже счётчик соответствующий есть, Page Faults называется.
Это просто счетчик ошибок доступа. Но а вешать костыль на определение, mmf это или нет, и если да - при необходимости дочитывать кусочек - этого винда не делает. И я считаю, что это верно. Хотя и жаль, конечно.
16 ноя 20, 15:26    [22233016]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4724
YuRock
Это просто счетчик ошибок доступа. Но а вешать костыль на определение, mmf это или нет, и если да - при необходимости дочитывать кусочек - этого винда не делает.

Конечно это счётчкик ошибок доступа. Когда ты мапишь файл, то физические страницы под него не выделяются, а просто резервируется адресное пространство. Затем, при попытке обратится по адресу из зарезервированного диапазона, возникает ошибка доступа т.к. реальной страницы в памяти нет. Система обрабатывает этот случай и подгружает страницу. Таким образом, счётчик увеличивается, а ты получаешь актуальные данные.
16 ноя 20, 16:11    [22233054]     Ответить | Цитировать Сообщить модератору
 Re: Файлы, отображаемые в память.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6176
YuRock,

гугли: защищенный режим X86, дескрипторы страниц
17 ноя 20, 00:36    [22233416]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить