Russian Qt Forum
Сентябрь 21, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проецирование файла в память  (Прочитано 6576 раз)
spectr_yury
Гость
« : Октябрь 22, 2010, 14:37 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 22, 2010, 16:51 »

Вероятно никак, т.к. ОС имеет ограничение на размер выделяемого блока. Напр. я не смог выделить блок более 1 Гб (хотя физически имеется 4). Хотя потом я нашел способ это сделать (vm_allocate), пришлось разлюбить такие длинные сказки  Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Октябрь 24, 2010, 22:11 »

Использовать 64 битную ось. Или забыть про такую технику программирования для файлов > 2 ГБ (при некоторых танцев с бубном можно добиться и 3 ГБ).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 25, 2010, 09:10 »

Использовать 64 битную ось. Или забыть про такую технику программирования для файлов > 2 ГБ (при некоторых танцев с бубном можно добиться и 3 ГБ).
64 бит ничего в этом смысле не меняет, слишком большой блок все равно не выделяется (по крайней мере на моей оси). Мне пришлось довольно много переделывать чтобы избавиться от таких выделений, но др. способа я не нашел.
Записан
BRE
Гость
« Ответ #4 : Октябрь 25, 2010, 13:11 »

64 бит ничего в этом смысле не меняет, слишком большой блок все равно не выделяется (по крайней мере на моей оси). Мне пришлось довольно много переделывать чтобы избавиться от таких выделений, но др. способа я не нашел.
А что была за ось?
Проверил у себя в linux x86_64, спокойно мапятся образы жестких дисков VirtualBox размером 7 - 10 Gb, не говоря о DVD-образах.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 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 - вылет.
« Последнее редактирование: Октябрь 25, 2010, 14:41 от Igors » Записан
BRE
Гость
« Ответ #6 : Октябрь 25, 2010, 15:55 »

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


Страница сгенерирована за 0.049 секунд. Запросов: 23.