Russian Qt Forum

Qt => Мультимедиа => Тема начата: spectr_yury от Октябрь 22, 2010, 14:37



Название: Проецирование файла в память
Отправлено: spectr_yury от Октябрь 22, 2010, 14:37
Добрый день! Возникла потребность работы с большими изображениями (1Гб и больше). Пользуюсь функцией:
Код:
uchar * QFile::map ( qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions )
С файлами размером 500Мб работает хорошо, однако возвращает 0 при попытке спроецировать файл в 2Гб. Не подскажите как решить данную проблему?


Название: Re: Проецирование файла в память
Отправлено: Igors от Октябрь 22, 2010, 16:51
Вероятно никак, т.к. ОС имеет ограничение на размер выделяемого блока. Напр. я не смог выделить блок более 1 Гб (хотя физически имеется 4). Хотя потом я нашел способ это сделать (vm_allocate), пришлось разлюбить такие длинные сказки  :)


Название: Re: Проецирование файла в память
Отправлено: xokc от Октябрь 24, 2010, 22:11
Использовать 64 битную ось. Или забыть про такую технику программирования для файлов > 2 ГБ (при некоторых танцев с бубном можно добиться и 3 ГБ).


Название: Re: Проецирование файла в память
Отправлено: Igors от Октябрь 25, 2010, 09:10
Использовать 64 битную ось. Или забыть про такую технику программирования для файлов > 2 ГБ (при некоторых танцев с бубном можно добиться и 3 ГБ).
64 бит ничего в этом смысле не меняет, слишком большой блок все равно не выделяется (по крайней мере на моей оси). Мне пришлось довольно много переделывать чтобы избавиться от таких выделений, но др. способа я не нашел.


Название: Re: Проецирование файла в память
Отправлено: BRE от Октябрь 25, 2010, 13:11
64 бит ничего в этом смысле не меняет, слишком большой блок все равно не выделяется (по крайней мере на моей оси). Мне пришлось довольно много переделывать чтобы избавиться от таких выделений, но др. способа я не нашел.
А что была за ось?
Проверил у себя в linux x86_64, спокойно мапятся образы жестких дисков VirtualBox размером 7 - 10 Gb, не говоря о DVD-образах.


Название: Re: Проецирование файла в память
Отправлено: Igors от Октябрь 25, 2010, 14:30
А что была за ось?
Проверил у себя в linux x86_64, спокойно мапятся образы жестких дисков VirtualBox размером 7 - 10 Gb, не говоря о DVD-образах.
OSX 10.5.8

Edit: чтобы не было путаницы: я говорю о выделении блока, (это строго говоря не то же самое что мапить файл). Больше 1 Gb - new, malloc возвращают 0. Можно выделить через vm_allocate (нативняк) но затем попытки изменить размер такого блока ни к чему не ведут. На Windows XP64 проверял бегло, но ситуация выглядит той же. Простой тест в Qt - масштабировать картинку. Когда размер превысит 1 Gb - вылет.


Название: Re: Проецирование файла в память
Отправлено: BRE от Октябрь 25, 2010, 15:55
Edit: чтобы не было путаницы: я говорю о выделении блока, (это строго говоря не то же самое что мапить файл). Больше 1 Gb - new, malloc возвращают 0. Можно выделить через vm_allocate (нативняк) но затем попытки изменить размер такого блока ни к чему не ведут. На Windows XP64 проверял бегло, но ситуация выглядит той же. Простой тест в Qt - масштабировать картинку. Когда размер превысит 1 Gb - вылет.
Странно все это. В 64-битном линуксе все выделяется без проблем. Хочешь 2 Гб, хочешь 10.