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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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