|
|
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Delphi XE8 Вопрос про выделение памяти. Мне необходимо экономно выделять RAM память для хранения списка файлов. Программа рекурсивно прочитывает с диска список файлов и кладет их в мои структуры TFileInfo (для хранения информации о каждом файле я заранее выделяю место new/dispose в куче), а указатели на каждый блок в памяти я храню в динамическом массиве. Проблема : Вроде бы память под хранение указателей выделяется экономно, но если файлов слишком много (около 2-3 млн), то программа не может найти непрерывный кусок памяти в куче под динам.массив указателей и выдает "Out of memory". "Вся соль", как я понял, в выделении непрерывного куска памяти. Но динам.массив мне нравится тем, что к элементам можно обращаться по индексу, в отличии от связанного списка. Чем можно заменить динамический массив? Может TStringList - в нем тоже можно обращаться по индексу, но я не знаю, как выделяется память для StringList - если тоже непрерывным куском, то такая же засада, как и с динамическими массивами. Что посоветуете, где хранить указатели? Заранее благодарен за советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:27 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, А нельзя выделять память кусками поменьше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:35 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52но я не знаю, как выделяется память для StringList Исходники же доступны. Я-бы использовал одно из двух: 1. TList и производные (с хэшами, например). 2. Связанный список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:36 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
3 млн указателей - приблизительно 12Мб... система такой кусок памяти не может найти? Это сильно странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:39 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, От связанных списков толку очень мало, и их применение оправдано только в специфических случаях. К экономии памяти их использование не приведёт. Списочные структуры (List, TStringlist) при расширении, когда места мало, выделяют новый массив длиной на четверть больше. Однако менеджер памяти должен освободить старый участок (с этим были проблемы во времена D6-7 - тогда менеджер был ленив и при постоянном расширении массива на единицу можно было забить всю память, сейчас это не так актуально). Уменьшить количество перераспределений памяти можно, задав Capacity сразу разумное значение. Однако память под указатели явно меньше, чем под данные - есть ли уверенность, что память под данные корректно обрабатывается, вовремя освобождается? Думаю, стоит показать важные куски кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:52 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, что мешает использовать многомерные динамические массивы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:53 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
можно сделать класс с этими TFileInfo и использовать TObjectList например... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 08:57 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
MBo, Ну не на четверть... Первый столбец реальное кол-во элементов, второй Capacity - TstringList 000001 - 000004 000005 - 000008 000009 - 000012 000013 - 000028 000029 - 000044 000045 - 000060 000061 - 000076 000077 - 000095 000096 - 000118 000119 - 000147 000148 - 000183 000184 - 000228 000229 - 000285 000286 - 000356 000357 - 000445 000446 - 000556 000557 - 000695 000696 - 000868 000869 - 001085 001086 - 001356 001357 - 001695 001696 - 002118 002119 - 002647 002648 - 003308 003309 - 004135 004136 - 005168 005169 - 006460 006461 - 008075 008076 - 010093 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:00 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Хотя да, пардон... с утра не углядел :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:03 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, посоветую прежде всего разобраться, почему память так фрагментируется. Даже если эту частную задачу решить, потом все равно что-то вылезет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:04 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Вопрос в том, как выделяется память под TStringList, а не на сколько увеличивается. Если выделяется цельным куском, как для динамич. массива, то засада. > 3 млн указателей - приблизительно 12Мб Да, 12 МБ - мало, но даже такого цельного куска в куче может не найтись, даже если на ПК 15 ГБ RAM. Про 3D динам.массив - тоже идея, если для каждой строки такого массива будет выделяться отдельный кусок в памяти, не пристыкованный к уже имеющемуся куску. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:06 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52Вопрос в том, как выделяется память под TStringList, а не на сколько увеличивается. Если выделяется цельным куском, как для динамич. массива, то засада. > 3 млн указателей - приблизительно 12Мб Да, 12 МБ - мало, но даже такого цельного куска в куче может не найтись, даже если на ПК 15 ГБ RAM. Про 3D динам.массив - тоже идея, если для каждой строки такого массива будет выделяться отдельный кусок в памяти, не пристыкованный к уже имеющемуся куску. Цельным - там массив такой же внутри Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:14 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
zinpub, не совсем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:17 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Вроде он самый Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:26 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
память фрагментируется, когда часто вызывается SetLength для динамического массива. Как часто вы изменяете размер этого динамического массива? Можно ли изменять (устанавливать) размер массива кусками не по одной структуре, а, скажем, сразу сотней или тысячей? Тогда массив не так часто будет пересоздаваться и память не будет так фрагментироваться.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:28 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
zinpubm52Вопрос в том, как выделяется память под TStringList, а не на сколько увеличивается. Если выделяется цельным куском, как для динамич. массива, то засада. > 3 млн указателей - приблизительно 12Мб Да, 12 МБ - мало, но даже такого цельного куска в куче может не найтись, даже если на ПК 15 ГБ RAM. Про 3D динам.массив - тоже идея, если для каждой строки такого массива будет выделяться отдельный кусок в памяти, не пристыкованный к уже имеющемуся куску. Цельным - там массив такой же внутри Код: pascal 1. zinpub, в этой же цитате речь и о многомерных массивах, для них память выделяется иначе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:35 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Там да массив ссылок на массивы вроде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:42 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Тест в Berlin отрабатывает за пару секунд, выделяя 15 миллионов раз память до гигабайта включительно. Переполнения нет (для полутора гиг - будет, система 32-разрядная) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 09:43 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52 > 3 млн указателей - приблизительно 12Мб Да, 12 МБ - мало, но даже такого цельного куска в куче может не найтись, даже если на ПК 15 ГБ RAM. Для 32-битного Win-приложения доступна виртуальная память 2 ГБ в независимости от того, сколько на ПК установлено ОЗУ. Эти 2 ГБ не являются непрерывной областью, скорее всего и 1ГБ непрерывной области Вы не обнаружите. Однако этож как можно засрать память, чтобы в ней не нашлось цельного куска 12 МБ? Начиная в Delphi 2007 (или даже 2006) используется "новый" менеджер памяти (FastMM), с которым стало очень сложно добиться сильной фрагментации памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 12:51 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Вы не забывайте, что в куче еще выделяется место для 3 млн структур типа TFileInfo - именно они занимают большую часть памяти в куче, хотя каждый элемент - это отдельный маленький блок, под который выделена память с помощью new(), поэтому эти структурки не требуют непрерывного массива памяти, в отличии от динамического массива указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 13:11 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52> место для 3 млн структур типа TFileInfo Может, ты и все 3 млн файлов открытыми держишья? Рассказывай уж все сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 13:15 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
DmSerm52> 3 млн указателей - приблизительно 12Мб Да, 12 МБ - мало, но даже такого цельного куска в куче может не найтись, даже если на ПК 15 ГБ RAM. Для 32-битного Win-приложения доступна виртуальная память 2 ГБ в независимости от того, сколько на ПК установлено ОЗУ. Эти 2 ГБ не являются непрерывной областью, скорее всего и 1ГБ непрерывной области Вы не обнаружите. Однако этож как можно засрать память, чтобы в ней не нашлось цельного куска 12 МБ? Начиная в Delphi 2007 (или даже 2006) используется "новый" менеджер памяти (FastMM), с которым стало очень сложно добиться сильной фрагментации памяти. Я в это всё не верю. Если нет у менеджера - он попросит у системы эти 12мб. А система их найдет всегда, хоть на свопе. Тут проблема в том, вангую, что уже 2Гб растрачены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 13:27 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
MBoОднако менеджер памяти должен освободить старый участок (с этим были проблемы во времена D6-7 - тогда менеджер был ленив и при постоянном расширении массива на единицу можно было забить всю память Не замечал такого поведения за всю жизнь. Когда TList'у не хватает массива указателей - он пытается сделать реаллок, и если не получается - то создает новый массив бОльшего размера, копирует туда и освобождает старый. Как в таком подходе можно "забить всю память" - я не знаю. Нормальный менеджер памяти в D6-D7 - FastMM, кстати, тоже вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 13:30 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Тут уже несколько раз написали про фрагментацию памяти, и смена менеджера памяти вряд ли поможет. Сам с этим сталкивался, когда делается большое кол-во реаллоков (особенно если это происходит не просто в цикле, а в процессе какого-то более сложного процесса с промежуточными выделениями памяти) обязательно настанет момент, когда система не сможет выделить непрерывный кусок памяти большого размера. Это легко представить, если нарисовать на листочке в клеточку: вот массив из одного элемента, потом делаем реаллок - из двух (но старт массива уже в другой части доступной области), затем из трёх и так далее. Каждый раз - всё больше и больше (и каждый раз старт массива смещается). Решается просто: или сразу выделяем большое кол-во памяти под массив + переменная, показывающая реальное кол-во элементов, либо переходим на TList и задаём ему Capacity ~ кол-во файлов (который как раз и нужен, чтобы не делать постоянные реаллоки). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:05 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
delphinotesи задаём ему Capacity ~ кол-во файлов Знать-бы еще заранее количество файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:14 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Заранее кол-во файлов неизвестно. Делаю выделение памяти по 1000 элементов, потом незаполненный "хвост" обрезаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:16 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
wadman, Зависит от задачи, в некоторых случаях это можно с некоторой погрешностью предсказать без реального перебора данных (в данном случае файловой системы). Если предсказать в общем случае нельзя - то: а) AList.Capacity := MaxListSize; б) DoWork(AList); в) AList.Capacity := AList.Count; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:17 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, Лучше использовать геометрическую прогрессию, например тот же TList это делает так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:20 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
YuRock, Было, было такое, я помню регулярные вопросы про Setlength(Arr, N+1) в цикле лет 15 назад. Понятно, что не все с этим сталкивались. А FastMM включили в состав Delphi в районе D2006, до этого был http://rsdn.org/article/Delphi/memmanager.xml (FastMM можно было подключить вручную) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:21 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, в общем, поставь какой-нибудь мониторинг памяти вроде VMMap и смотри где у тебя возникает фрагментация. Шаманить с кодом не зная деталей обычно бесполезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:37 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы и обсуждения. Буду пробовать, экспериментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 14:45 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
А в чем вообще загадка-то? 32-разрядная прога, 2 Гб лимит по общему потреблению. 2 млн записей по 1000 байт - и привет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 17:10 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Вся соль в том, что я использую динамические массивы для хранения указателей и в один прекрасный момент в куче не может найтись цельного (непрерывного) куска памяти для хранения например 2 млн указателей. Поэтому ищу способ выделения памяти не цельным куском, тогда уменьшится вероятность Out of memory. Задача именно уменьшить вероятность, а не полностью избавиться от этой ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 18:00 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
08.10.2018 18:00, m52 пишет: > для хранения например 2 млн указателей. крассаучег! (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 18:02 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, Вся соль в том, что пример 21692228 показывает, что динамический массив увеличивает свою длину 63 миллиона раз вплоть до размера в гигабайт, и это работает. Поэтому ещё раз рекомендую показать свой драгоценный код (минимальный воспроизводимый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2018, 19:33 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52Здравствуйте, Вся соль в том, что я использую динамические массивы для хранения указателей и в один прекрасный момент в куче не может найтись цельного (непрерывного) куска памяти для хранения например 2 млн указателей. Поэтому ищу способ выделения памяти не цельным куском, тогда уменьшится вероятность Out of memory. Задача именно уменьшить вероятность, а не полностью избавиться от этой ошибки. А откуда ты знаешь, что OOM именно от нехватки цельного куска размером 2М*4б = 8Мб? Попробуй не выделять память под записи, а просто добавлять в массив нулевые указатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2018, 09:44 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
m52, А винда не 32-битная ли случайно? Если да - то сколько суммарно памяти свободной остается для всех прог? Может, её кто-то съел уже всю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2018, 11:56 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
09.10.2018 11:56, YuRock пишет: > > А винда не 32-битная ли случайно? > Если да - то сколько суммарно памяти свободной остается для всех прог? не имеет значения. если конечно поциент не выключил своп. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2018, 12:02 |
|
||
|
Динамические массивы - вопрос выделения памяти. Out of memory
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий09.10.2018 11:56, YuRock пишет: > > А винда не 32-битная ли случайно? > Если да - то сколько суммарно памяти свободной остается для всех прог? не имеет значения. если конечно поциент не выключил своп.А, ну да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2018, 13:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2040306]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 341ms |

| 0 / 0 |
