Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TStringList в Win32 и контроль выхода за границы доступной памяти / 23 сообщений из 23, страница 1 из 1
30.06.2021, 09:12
    #40080840
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Всем доброго дня,

размер списка TStringList ограничен MaxListSize = Maxint div 16 что составляет 134 217 727.
Столкнулся со случаем когда в коде в список заносили примерно 1 300 000 строк и походу происходило переполнение по памяти.
Как правильно проконтролировать сколько доступно ещё физической памяти для дальнейшего заполнения этого списка?
Есть ли альтернатива TStringList которая позволяет выйти за границы физической памяти (например со свопингом на диск)?
Приложение win32, delphi 10.4.1.

Спасибо
...
Рейтинг: 0 / 0
30.06.2021, 09:39
    #40080846
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
32 может пожрать максимум 2 гига, с ухищрениями - 3. Ты быстрее в это упрешься. А своп и так автоматом применяется, если настроен в системе
...
Рейтинг: 0 / 0
30.06.2021, 10:31
    #40080860
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Fr0sT-Brutal
32 может пожрать максимум 2 гига, с ухищрениями - 3. Ты быстрее в это упрешься. А своп и так автоматом применяется, если настроен в системе


да, это понятно. Я имел ввиду может существуют списки которые работают с данными порциями, по мере обрашения к индексу списка. Потому как выход за границы (134 217 727) индекса не предполагается и проблема толко в том что TStringList пытается запихнуть в память всё сразу. Тут бы конечно во временную таблицу в базе всё запихнуть и не иметь проблем, но проект был написан ещё в 2005м и в качестве бызы выступает парадокс со всеми вытекающими. И в сушествуюшую логику впихнуть работу через таблицы будет сложно. Хотелось бы выкрутиться просто заменой TStringList.
...
Рейтинг: 0 / 0
30.06.2021, 10:41
    #40080867
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun
в список заносили примерно 1 300 000 строк и походу происходило переполнение по памяти

Не понимаю при чём тут ограничение на размер списка. Ну занесли вы в него 1 млн элементов, а вам ещё доступно ~130 млн - есть ещё где развернуться.
...
Рейтинг: 0 / 0
30.06.2021, 10:47
    #40080869
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun,

переполнение памяти происходит, конечно же, не из-за ограничения MaxListSize. собирай проект в 64 бита, должно помочь.
...
Рейтинг: 0 / 0
30.06.2021, 10:49
    #40080870
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
zedxxx
hlopotun
в список заносили примерно 1 300 000 строк и походу происходило переполнение по памяти

Не понимаю при чём тут ограничение на размер списка. Ну занесли вы в него 1 млн элементов, а вам ещё доступно ~130 млн - есть ещё где развернуться.

по длине списка ограничения нет. Я эту цифру привёл что бы показать что этого ограничения нет.
...
Рейтинг: 0 / 0
30.06.2021, 10:49
    #40080871
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun
zedxxx
пропущено...

Не понимаю при чём тут ограничение на размер списка. Ну занесли вы в него 1 млн элементов, а вам ещё доступно ~130 млн - есть ещё где развернуться.

по длине списка ограничения нет. Я эту цифру привёл что бы показать что этого ограничения нет.


ок, увидел, что винда 32. тогда всё печально. или база, или никак.
...
Рейтинг: 0 / 0
30.06.2021, 10:52
    #40080872
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
авторКак правильно проконтролировать сколько доступно ещё физической памяти для дальнейшего заполнения этого списка?

можно пробовать отловить OOM, бывает, что это успешно получается. всё остальное еще меньше надежно. кардинально проблема решается только работой с той или иной базой.
...
Рейтинг: 0 / 0
30.06.2021, 10:54
    #40080873
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun, В таком случае, разве долго написать TStringList с SQLite3 бекэндом? Час-другой и проблема решена. Быстрее, чем на форуме ответа искать.
...
Рейтинг: 0 / 0
30.06.2021, 10:55
    #40080874
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
makhaon
hlopotun,

переполнение памяти происходит, конечно же, не из-за ограничения MaxListSize. собирай проект в 64 бита, должно помочь.

Не получится. Классы для работы с Paradox и куча других библиотек и модулей. Проект большой, уже 25 лет в разработке. Частично привязян ещё к Delphi 5.
...
Рейтинг: 0 / 0
30.06.2021, 10:56
    #40080875
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
zedxxx
hlopotun, В таком случае, разве долго написать TStringList с SQLite3 бекэндом? Час-другой и проблема решена. Быстрее, чем на форуме ответа искать.

интересная идея, надо подумать
...
Рейтинг: 0 / 0
30.06.2021, 11:43
    #40080881
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun,
откуда берутся строки для StringList? Из БД, из каких-то файлов? Или ещё откуда-то?
...
Рейтинг: 0 / 0
30.06.2021, 12:10
    #40080890
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun,

нет ли в проекте большого инкрементного складывания строк? типа s := s + 'shdadhas'; s := s + '12312321' etc.
Может быть просто фрагментация памяти и не возможность выделения большой строки ...
...
Рейтинг: 0 / 0
30.06.2021, 12:20
    #40080895
delphinotes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotun,

Память может закончиться не столько потому, что много элементов, сколько из-за её дефрагментации, когда список заполняется поштучно и каждый Grow выделяет больший кусок памяти под элементы в новой области кучи. Попробуй сначала задать Capacity побольше, затем заполнить список, примерно так:
Код: pascal
1.
2.
3.
StringList.Capacity := 5000000; // 5 млн.
.. fill StringList ...
StringList.Capacity := StringList.Count;
...
Рейтинг: 0 / 0
30.06.2021, 12:38
    #40080898
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
hlopotunЯ имел ввиду может существуют списки которые работают с данными порциями, по мере
обрашения к индексу списка.

Ты не поверишь, но это TTable. Просто научись с ним правильно работать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2021, 13:50
    #40080926
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Dimitry Sibiryakov

hlopotunЯ имел ввиду может существуют списки которые работают с данными порциями, по мере
обрашения к индексу списка.

Ты не поверишь, но это TTable. Просто научись с ним правильно работать.

TTable же не выгружает уже загруженные строки?

Автору: можно сделать потомка от стринглиста, который бы прозрачно контролировал расход памяти и выгружал (обнулял) элементы при достижении лимита. Сложного ничего, достаточно перекрыть Insert, Delete и SetItem. Ну и определиться, по какому принципу выгружать (самое простое - при обращении к элементу N очищать все предыдущие непустые, пока общий размер не уляжется в лимит; но это только для случаев последовательного перебора. Для случайного доступа нужно использовать алгоритм вытесняющего кеша)
...
Рейтинг: 0 / 0
30.06.2021, 13:54
    #40080928
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
30.06.2021 13:50, Fr0sT-Brutal пишет:
> TTable же не выгружает уже загруженные строки?

с чего ты взял?
TTable работает с IDAPI.
ему "загружать" всё на себя не нужно.
любая строка ему доступна.
это не клиент-сервер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2021, 14:41
    #40080943
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Мимопроходящий

30.06.2021 13:50, Fr0sT-Brutal пишет:
> TTable же не выгружает уже загруженные строки?

с чего ты взял?
TTable работает с IDAPI.
ему "загружать" всё на себя не нужно.
любая строка ему доступна.
это не клиент-сервер.

Давно эти времена BDE были, не помню уж. Каждую запись заново с файла считывает? Сурово.
...
Рейтинг: 0 / 0
30.06.2021, 14:48
    #40080945
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
30.06.2021 14:41, Fr0sT-Brutal пишет:
> Давно эти времена BDE были, не помню уж. Каждую запись заново с файла считывает? Сурово.

кешированием занимается ядро BDE и ОСь.
TTable только обёртка над IDAPI.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2021, 15:25
    #40080967
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Мимопроходящийкешированием занимается ядро BDE и ОСь.

И грид (или TDataLink?..). Поэтому от его дизайна хочется биться головой об стену.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2021, 15:29
    #40080970
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
30.06.2021 15:25, Dimitry Sibiryakov пишет:
> И грид (или TDataLink?..). Поэтому от его дизайна хочется биться головой об стену.

насущная необходимость внедрения TDataLink в архитектуру классов VCL - для меня лично тайна великая.
когда-то давно дискутировали с покойным Анатолием на сию тему, но так и не пришли к общему мнению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2021, 15:36
    #40080972
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Тогда уж лучше TClientDataset. Ему не нужна вся эта ботва.
...
Рейтинг: 0 / 0
30.06.2021, 15:46
    #40080975
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TStringList в Win32 и контроль выхода за границы доступной памяти
Vlad FТогда уж лучше TClientDataset.

Он память жрёт гораздо сильнее, чем TStringList, ибо точно так же не умеет сбрасывать кэш
на диск.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TStringList в Win32 и контроль выхода за границы доступной памяти / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]