![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Очень хотелось бы работать с большими (порядка 1-2 Гб) файлами как с единым массивом байт, не используя файловые операции ввода-вывода C/C++. Подумал, что для таких целей лучше всего воспользоваться проецированием файлов в память, но когда попытался сие реализовать, наткнулся на ряд подводных камней.
Условия: файлы бинарные, работа с ними предполагает только их чтение, обращение к содержимому преимущественно последовательное, хотя в некоторых случаях будет требоваться и произвольный доступ. Примерный код в упрощенном виде:
Время от времени программа "спотыкается" при вызове MapViewOfFile. pbFile при этом равен NULL, а функция GetLastError возвращает значение 8 ("Недостаточно памяти для обработки команды"). Причем никак не могу проследить логику возникновения данной ситуации - то файл размером ~1,2 Гб проецируется на ура (при этом запущена куча приложений), то файл ~600 Мб не хочет (притом, что практически ничего не запущено). Утечек памяти в программе нет. Все, что открывается - то закрывается, все что выделяется - то освобождается... Если снять галки с "Build with runtime packages" и "Use dymamic RTL", то ситуация улучшается, можно работать с бОльшими по размеру файлами. Если же ничего к программе не цеплять, то опять нехватка памяти. От чего зависит размер файла, который можно целиком маппировать в память? Или придется отказаться от проецирования файла целиком, и маппировать его по кускам? (...чего, собственно, очень хотелось бы избежать, в таком случае уж лучше стандартными C++-средствами с файлом работать...) -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Empirik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 28.10.2005 Где: Россия, Пермь Репутация: нет Всего: 1 |
А чем тебе не нравиться fstream (fstream - заголовочный файл)? У него же можно указать размер буфера. Или я не правельно понимаю, чего ты хочешь
Это сообщение отредактировал(а) Empirik - 16.2.2006, 13:34 --------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
размер файла, который можно спроецировать должен быть меньше размера свободной памяти иначе будет выполняться копирование с диска на диск ( а оно нам надо? )
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
BreakPointMAN, Вы в одном процессе только один файл отображаете, или несколько?
|
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Проецирование файла в память - это не совсем то же самое, что загрузка его в буфер. Я бы даже сказал, что это вообще разные вещи, хотя кое в чем сходство есть...
Несколько, по очереди. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| Lotrex |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
То есть у Вас файлы отображаются не одновременно? Сначала один отображаете, с ним работаете, потом все, что с ним связано закрываете/грохаете, опосля беретесь за другой, так? Я спрашиваю, потому что в винде для каждого процесса отводится по 2Гб памяти. Если сумма объемов отображаемых одновременно файлов (в одном процессе) будет превышать это значение, то это может вызвать ту ошибку... И еще: у Вас последний параметр функции MapViewOfFile (параметр dwNumberOfBytesToMap) равен 0. Вот что про энтот параметр в описании написано:
От указанного смещения до конца секции, а не файла! Черт его знает, что это секция означает, но мож просто туды вместо 0 размер файла влындить для ясности? Это сообщение отредактировал(а) Lotrex - 16.2.2006, 20:26 |
||||
|
|||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Именно так.
Пробовал...
ну... пошуршал бы винтом... поюзал бы файл подкачки... По всей видимости, ошибка возникает, когда нет непрерывного куска памяти достаточного размера в адресном пространстве... от чего может зависеть фрагментация адресного пространства процесса? -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
BreakPointMAN, дядька Рихтер приводил пример обработки больших фалов по частям
|
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Читал, знаю...
но... блин... очень не хотелось бы так делать... одно дело 16 экзабайтов, другое - 1-2 гигабайта... если маппировать по частям, то теряется вся прелесть данного подхода и придется усложнять алгоритм... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Хрен его знает... Я даже не знаю, как можно кучу дефрагментировать.... Может, что бы со всей этой дефрагментацией для работы с файлом отдельный процесс (thread)создавать? У него адресное пространство чистенькое будет, не фрагментированное... |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Или отдельную кучу, или thread со своей кучей |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
ни первое ни второе не реализуемо. на весь процесс адресное пространство одно.
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Lotrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 9.2.2006 Где: Казань Репутация: 2 Всего: 3 |
Чтой-то я не понял, к чему это... По моему разумению, у нового процесса (CreateProcess) будет свои 2 Гб виртуальной памяти (нефрагментированной и ничем не занятой). Али я не не прав? Это сообщение отредактировал(а) Lotrex - 17.2.2006, 18:45 |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
у процесса -- да. но не у потока этого же процесса ( как советовал threef ) и не в этом же процессе ( именно там будет создаваться вторая куча )
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Конечно, весь огромный файл отобразить в память не получится.
Да и зачем? Этот какой-то безумный перерасход виртуальной памяти... Хочешь прозрачно работать с таким файлом как с плоским массивом, напиши простую обертку, которая будет перемещать окно MapView при необходимости. Заодно и открытие\закрытие спрячешь... Размер окна можно подобрать оптимальный, в зависимости от задачи. Мне обычно 64 К хватает. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |