| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > нехватка оперативной памяти ? |
| Автор: Remiznik 30.7.2009, 14:37 |
| Нужно загрузить очень большой фале в ОП но её может не хватить как сделать чтоб программа не падала от нехватки ОП ? У меня есть две идеи но как их реализовать не знаю ! 1. Начать закружать ОП и если она кончиться то перехватить это исключение и обработать его. 2. Каким-то обзором определить количество свободной ОП до начала загрузки файла и уже там думать что с этим делать. По 1 не знаю какое исключение генерируется и как его отловить. По 2 не знаю как определить кол-во свободной ОП. Посоветуйте что делать, или может есть ешо какие идеи для предотвращения паления программы ! |
| Автор: Sartorius 30.7.2009, 14:39 |
| А вы про виртуальную память слышали? До вас уже обо всем позаботились... ЗЫ Что то мне подсказывает, что вашу задачу можно решить без загрузки в память всего файла. |
| Автор: azesmcar 30.7.2009, 14:45 |
| Remiznik Используй функцию http://linux.die.net/man/2/mmap. |
| Автор: Remiznik 1.8.2009, 15:07 |
| azesmcar, спасибо за ссылку но както пока не разобрался как использовать эту функцию ... примера нет а по описанию мне както не вникнуть что она делает . Cheloveck а можно поподробнее по потоки , как ты их используешь чтоб не загружать весь в фаел в ОП ? |
| Автор: azesmcar 1.8.2009, 15:42 | ||||
Что, примеров не нашел? http://www.cs.purdue.edu/homes/fahmy/cs503/mmap.txt http://www.linuxquestions.org/questions/programming-9/mmap-tutorial-cc-511265/ http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/ http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/apis/mmap.htm http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html Добавлено через 57 секунд Написано же
http://www.translate.ru |
| Автор: Remiznik 1.8.2009, 15:52 |
| то есть в функцию передаём файл и она проверяет поместится он в ОП или нет ? |
| Автор: azesmcar 1.8.2009, 17:18 | ||
нет, проецирует файл в память. |
| Автор: Cheloveck 2.8.2009, 13:23 | ||||
Вот кусок из одной из моих прог. |
| Автор: andrew_121 2.8.2009, 13:58 |
| Cheloveck, Что-то я не вижу чтоб было указанно что данные только текстовые. Добавлено через 6 минут и 26 секунд Remiznik, Так задача собственно какая? Скопировать файл? Если да, то тут: http://forum.vingrad.ru/forum/topic-267913.html |
| Автор: LisAnd 3.8.2009, 12:11 |
| Отображаемая память рулит |
| Автор: Remiznik 3.8.2009, 21:19 | ||
задача в том что есть файл там данные записаны особенным обзором и их не просто нужно загрузить в память а в вектор но прежде чем загрузить в вектор нужно выделить под него память а если файл слишком большой выдать предупреждении !
и мне нужно знать хватит ли места в ОП для этого вектора. |
| Автор: vinick 3.8.2009, 22:05 |
Можешь попробовать ловить std::bad_alloc из resize и SIGSEGV. resize вызывает констурторы для элементов, следовательно доступ к памяти будет, а значит либо исключение, либо сигнал выстрелят. Но лучше пересмотреть алгоритм. Что ты будешь делать если файл попадется такой, что со скрипом влезет в память, но ни на что другое памяти уже не останется? А что делать пользователю с твоим предупреждением? бежать в магазин за планкой памяти, за двумя или заказывать кластер на петабайт? |
| Автор: Remiznik 3.8.2009, 22:27 |
| да я понимаю что все данные загружать в ОП это абсурд ... но если файл не помешается в ОП то я применю алгоритм и буду выборочно загружать .... но если файл помешается то надо загрузить ! |
| Автор: andrew_121 3.8.2009, 22:27 |
| Напиши свой объект вектор. В нем, вместо выделения памяти, используй проецирование файла в память. Какие именно операции ты выполняешь с этим вектором? |
| Автор: Remiznik 3.8.2009, 22:35 |
| просто я использую эти данные для дальнейшей обработки ....можно конечно напрямую данные брать из файла на диске но это при большом количестве обращений к файлу очень влияет на время работы. |
| Автор: andrew_121 3.8.2009, 22:50 | ||
| Remiznik, Ты не понял. Т.е. Какие методы вектора, содержащего данные из этого файла, тебе нужны? Пример:
Вот. Реализуй необходимые тебе методы. Добавлено @ 22:52 Я показал пример реализации вектора с перегруженным оператором индексирования. |
| Автор: Remiznik 3.8.2009, 23:00 |
| да только функцию воврашения значения по индексу который мне нужен. Просто вектор использую в место массива мне так удобнее. |
| Автор: andrew_121 3.8.2009, 23:11 |
| Remiznik, Ну вот тебе каркас вектора использующего проецирование файла в память. Допиши и используй на здоровье. Добавлено через 9 минут и 41 секунду Щас поэкспериментирую, любопытно |
| Автор: andrew_121 4.8.2009, 01:00 | ||
В общем вот что получилось.
Странное поведение под виндавз. Съедает всю память, даже отбирает ее у запущенных программ/процессов. В Linux, все в порядке. Выделяет не больше чем свободной памяти есть. Процессы не обделяет. |
| Автор: MAKCim 5.8.2009, 19:43 | ||||
1. fread/fwrite используют кэш 2. mmap работает так же как и fread за исключением того, что чтение происходит неявным образом +readahead, который, к слову реализуется и через fread Добавлено через 1 секунду
1. fread/fwrite используют кэш 2. mmap работает так же как и fread за исключением того, что чтение происходит неявным образом +readahead, который, к слову реализуется и через fread |
| Автор: andrew_121 5.8.2009, 21:46 |
Да. Но если учесть что нужен произвольный доступ, не думаю что кэш будет работать при большом объеме файла. Не знал что есть такое. |
| Автор: MAKCim 6.8.2009, 20:39 |
setvbuf |
| Автор: andrew_121 6.8.2009, 21:14 |
Нужно экспериментировать. |