Russian Qt Forum
Ноябрь 24, 2024, 01:54
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Memory issues
Страниц:
1
2
[
3
]
4
5
...
7
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Memory issues (Прочитано 54094 раз)
SABROG
Гость
Re: Memory issues
«
Ответ #30 :
Сентябрь 14, 2009, 23:59 »
Цитата: Spectre от Сентябрь 14, 2009, 21:16
Читай топик выше, а лучше внимательно с самого начала, все уже разъяснили!
То что ты написал совершенно не относиться к делу, возможно ты не совсем понял о чем было обсуждение.
Все-таки не понимаю чем радикально отличается clean от erase? Первый работает, второй нет.
Записан
BRE
Гость
Re: Memory issues
«
Ответ #31 :
Сентябрь 15, 2009, 08:24 »
Цитата: Spectre от Сентябрь 14, 2009, 20:25
2) Максимальный размер кучи
определятся системой
.
Максимальный размер кучи зависит от самого процесса, ограничение связано с размером адресного пространства к которому может обращаться процесс. Для 32-битной системы он составляет 4 Gb.
Под linux пользовательскому коду предоставляется 3 Gb (0x00000000-0xBFFFFFFF), 1 Gb отводиться для ядра (0xC0000000-0xFFFFFFFF).
Под вендой XP (если я правильно помню): 2 Gb - пользователь, 2 Gb - ядро.
В пользовательской адресном пространстве расположены:
* разделяемые библиотеки (младшие адреса)
* код
* данные
* хип
* стек (старшие адреса)
Т.е. чем больше кода/данных тем меньше адресного пространства остается хипу, даже если система (с учетом свопа) имеет кучу свободной памяти, больше она процессу предоставить не сможет (т.к. процесс не сможет ее адресовать).
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Memory issues
«
Ответ #32 :
Сентябрь 15, 2009, 09:27 »
Фон-неймановские заморочки
Записан
ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Memory issues
«
Ответ #33 :
Сентябрь 15, 2009, 13:32 »
Добрый день
(просто инфа, может пригодится). Насчет блока > 1 Gb. Ничего не меняется в 64-bits, получаю все тот же NULL. Ничего не меняется и если стоит больше памяти (я эту проблему узнал от пользователя у которого стояло восемь)
По поводу баг репорта - по-моему все-таки надо сообщить. В документации ясно сказано:
Цитировать
void QVector::squeeze ()
Releases any memory not required to store the items.
The sole purpose of this function is to provide a means of fine tuning QVector's memory usage. In general, you will rarely ever need to call this function.
Нам память освободить обещали? Да, обещали, более того, прозрачно намекали что, мол, и без этого освободят. Так что пусть освобождают в следующих версиях. А будут они это делать через ::realloc или еще как - это их дело.
И QVector там не один такой - все что завязано на ::realloc тоже будет так себя вести
«
Последнее редактирование: Сентябрь 15, 2009, 18:07 от Igors
»
Записан
BRE
Гость
Re: Memory issues
«
Ответ #34 :
Сентябрь 15, 2009, 14:14 »
Цитата: Igors от Сентябрь 15, 2009, 13:32
По поводу баг репорта - по-моему все-таки надо сообщить. В документации ясно сказано:
Цитировать
void QVector::squeeze ()
Releases any memory not required to store the items.
The sole purpose of this function is to provide a means of fine tuning QVector's memory usage. In general, you will rarely ever need to call this function.
Нам память освободить обещали? Да, обещали, более того, прозрачно намекали что, мол, и без этого освободят. Так что пусть освобождают в следующих версиях. А будут они это делать через ::realloc или еще как - это их дело.
Не уверен, что это баг. Это фича, причем не Qt, а стратегии распределения памяти конкретной операционной системы.
В любом случае для выделения/перераспределения памяти будут использованы malloc и realloc, а их разработчики Qt переделать уже не смогут. (Кроме случае, если программа при старте будут откушивать всю памяти и потом сама ее распределять. Что будет совсем не гуд).
Проще не захватывать непрерывные куски памяти такого размера.
«
Последнее редактирование: Сентябрь 15, 2009, 14:31 от BRE
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Memory issues
«
Ответ #35 :
Сентябрь 15, 2009, 18:25 »
Цитата: BRE от Сентябрь 15, 2009, 14:14
Проще не захватывать непрерывные куски памяти такого размера.
Это точно, но тогда надо признать: проще не использовать QVector для больших данных, т.к. QVector внутри и есть непрерывный кусок. Контейнер который бы распределял память порциями (вместо одного большого куска) был бы ОЧЕНЬ нужен/полезен. Но я такого не нашел.
Записан
BRE
Гость
Re: Memory issues
«
Ответ #36 :
Сентябрь 15, 2009, 18:34 »
Цитата: Igors от Сентябрь 15, 2009, 18:25
Контейнер который бы распределял память порциями (вместо одного большого куска) был бы ОЧЕНЬ нужен/полезен. Но я такого не нашел.
QList, QMap, QHash.
А этим еще и свой аллокатор можно назначить (для повышения эффективности): std::vector, std::list, std::map, std::deque, ...
Записан
SABROG
Гость
Re: Memory issues
«
Ответ #37 :
Сентябрь 15, 2009, 18:36 »
Для эксперимента хотел попробовать провернуть тоже самое на std::list. Метод max_size() сказал, что я могу поместить в контейнер 357913941 итем типа int. Реально же я попытался выделить память под 100*1024*1024 итемов. В теории это не должно было занять больше 400Мб. На деле программа почему-то кушает до 1,6Гб после чего падает. А после этого компьютер начинает очень дико тормозить на любых операциях, даже если все программы позакрывать и открыть заново. Пришлось перезагружаться, на этом мои эксперименты закончились.
Записан
BRE
Гость
Re: Memory issues
«
Ответ #38 :
Сентябрь 15, 2009, 18:41 »
Цитата: SABROG от Сентябрь 15, 2009, 18:36
Реально же я попытался выделить память под 100*1024*1024 итемов. В теории это не должно было занять больше 400Мб.
Должно было занять больше.
std::list это список и по мимо рабочих данных (int value), в элементе для адресации списка нужен как минимум указатель на следующий элемент списка.
Записан
Winstrol
Гость
Re: Memory issues
«
Ответ #39 :
Сентябрь 15, 2009, 18:53 »
Цитата: BRE от Сентябрь 15, 2009, 18:41
std::list это список и по мимо рабочих данных (int value), в элементе для адресации списка нужен как минимум указатель на следующий элемент списка.
Как и на предыдущий.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Memory issues
«
Ответ #40 :
Сентябрь 15, 2009, 19:08 »
Цитата: BRE от Сентябрь 15, 2009, 18:34
Цитата: Igors от Сентябрь 15, 2009, 18:25
Контейнер который бы распределял память порциями (вместо одного большого куска) был бы ОЧЕНЬ нужен/полезен. Но я такого не нашел.
QList, QMap, QHash.
А этим еще и свой аллокатор можно назначить (для повышения эффективности): std::vector, std::list, std::map, std::deque, ...
Есть большие объемы данных, они встречаются редко (обычно 1-2 раза в задаче) но они есть. Это как правило тупенькие структурки (не бывает "много" да еще и "сложно"). Весь этот интеллект QMap, QHash мне для них совсем не нужен, мне их надо просто хранить и добавлять в хвост новые, упаковывать (лучше самому, без erase) . Иногда сортировать.
Остается QVector (обсудили) и QList - этот немного лучше. Но он бросается сразу делать new (если sizeof(T) > sizeof(void *), иначе тот же QVector) для каждого нового элемента
А это не очень подходит, да и памяти отъест.
Вот и получается - проще самопальный контейнер писать
Записан
BRE
Гость
Re: Memory issues
«
Ответ #41 :
Сентябрь 15, 2009, 19:11 »
Цитата: Igors от Сентябрь 15, 2009, 19:08
Вот и получается - проще самопальный контейнер писать
А stl-ные контейнеры?
Быстрее и эффективней Qt-ишных. Почему не использовать их?
Записан
SABROG
Гость
Re: Memory issues
«
Ответ #42 :
Сентябрь 15, 2009, 21:41 »
А мне кажется, что программа плохо спроектировна, если ей требуется столько оперативной памяти. Если винда полезет в своп, то на то и выйдет, что ты чанки будешь читать с винта, что из памяти, скорость будет та же.
С удовольствием почитал бы, почему Qtшные контейнеры хуже STL'ных. Кстати чьей реализации? Они по-разному работают с памятью.
Я не знаю, является ли QList аналогом std::list, но я четко вижу, что QList кушает как и положено не больше 500Мб при попытке поместить в контейнер ~100млн. int'ов, в то время как std::list'у при аналогичном коде не хватает 1,6Гб съеденной оперативы после чего программа падает, даже не ругнувшись в отладчик о нехватке памяти.
Записан
BRE
Гость
Re: Memory issues
«
Ответ #43 :
Сентябрь 15, 2009, 21:54 »
Цитата: SABROG от Сентябрь 15, 2009, 21:41
С удовольствием почитал бы, почему Qtшные контейнеры хуже STL'ных. Кстати чьей реализации? Они по-разному работают с памятью.
Не знаю где про это можно почитать, это мое мнение после тестовых прогонов.
Про QStack и std::stack разговор на crossplatform помнишь? На моей машине QStack из-за того что он реализован на базе QVector, проигрывает std::stack (сделанного на базе deque) точно не помню но примерно в 12 раз.
Недавнии тесты QMap и std::map уверенно показывают, что QMap проигрывает в скорости.
Зачем искать, что почитать - проверь сам?
Цитата: SABROG от Сентябрь 15, 2009, 21:41
Я не знаю, является ли QList аналогом std::list, но я четко вижу, что QList кушает как и положено не больше 500Мб при попытке поместить в контейнер ~100млн. int'ов,
Ты уверен?
Сегодня завтра посмотрю, но пока для меня это выглядит фантастикой.
Записан
BRE
Гость
Re: Memory issues
«
Ответ #44 :
Сентябрь 15, 2009, 22:22 »
Посмотрел.
Сравнивались QList и std::deque.
В список вставлялись 100 * 1024 * 1024 элементов int.
Process 1 (QList)
Time elapsed: 3207 ms
Process 2 (std::deque)
Time elapsed: 2674 ms
QList не является связанным списком, это массив указателей на T, т.е. его прямой аналог std::vector<T*>.
«
Последнее редактирование: Сентябрь 16, 2009, 08:33 от BRE
»
Записан
Страниц:
1
2
[
3
]
4
5
...
7
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...