Устранение ошибки "Insufficient memory for this operation" BDE в Лоцман

Автор NONE_NAME, 03.11.21, 13:30:16

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

NONE_NAME

Доброго времени суток

Написал плагин на C# для Лоцман PLM 2018.1 для выгрузки примерно 100.000 объектов со всеми их связями и атрибутами. На части машин плагин работает идеально и с задачей справляется, но на других в какой-то момент при выполнении запроса происходит ошибка с описанием "Insufficient memory for this operation". Результаты поиска  показали, что проблема кроется в BDE (Borland Database Engine), который выступает в роли посредника между API СУБД и программой, обращающейся к ней (в данном случае Лоцман). В процессе работы BDE кэширует полученные в результате запросов данные в память заданных размеров, и большое число запросов приводит к её переполнению.

На форумах пишут, что BDE имеет возможность изменить максимальный объем кэша через соответствующий пункт в Панели управления или инструмент BDEADMIN. Но ни того, ни другого не нашел.

Отсюда вопрос, как ещё можно обойти эту ошибку или достучаться до параметров BDE в Лоцман 2018?

p3452

Ха!
А выгружать данные порциями, контролируя количество записей в итоговом запросе, слабо?

NONE_NAME

Цитата: p3452 от 03.11.21, 13:36:44Ха!
А выгружать данные порциями, контролируя количество записей в итоговом запросе, слабо?
Запрашиваются небольшие порции данных. По каждому объекту запрашиваются или список атрибутов, или связанные объекты, по связям запрашиваются свойства (Properties) или атрибуты.
Но даже если так, то почему из двух по прочим параметрам равных машин, на одной и той же сборке спотыкается та, у которой больше оперативной памяти. В чем может крыться принципиальная разница этих двух машин, если не в настройках BDE?

Chaa

От BDE там используется только midas.dll, который не настраивается.

Попробуйте в Диспетчере задач добавить столбец "Рабочий набор (память)" или "Пиковый рабочий набор" и посмотреть, сколько памяти потребляется.

Дело в том, что Лоцман 32-х разрядный, и по памяти ограничен (2 Гб). Плюс фрагментации адресного пространства процесса. В какой-то момент не удается выделить нужный объем памяти.

p3452

Цитата: NONE_NAME от 03.11.21, 13:50:03на одной и той же сборке спотыкается та, у которой больше оперативной памяти
Это, как?
Тогда тут точно проблема в совместимости с 32x.

NONE_NAME

Цитата: Chaa от 03.11.21, 14:06:27От BDE там используется только midas.dll, который не настраивается.

Попробуйте в Диспетчере задач добавить столбец "Рабочий набор (память)" или "Пиковый рабочий набор" и посмотреть, сколько памяти потребляется.

Дело в том, что Лоцман 32-х разрядный, и по памяти ограничен (2 Гб). Плюс фрагментации адресного пространства процесса. В какой-то момент не удается выделить нужный объем памяти.

Это, как я понимаю, позволяет определить пиковые значения потребления виртуальной памяти, но не решит проблемы. Какие есть варианты действий после этого? Как я понимаю, есть два пути - расширить объем кэша или чистить кэш. Если первое невозможно, то как реализовать второе?

NONE_NAME

Цитата: p3452 от 03.11.21, 14:17:57Это, как?
Тогда тут точно проблема в совместимости с 32x.

Если верить заказчику, у него на машине с 16Гб памяти плагин отрабатыввает без проблем, а на машине с 32Гб выдает данную ошибку.

Сергей Фадеев

Необходимо заменить версию библиотеки midas.dll, см. вложение.
Предварительно сделайте резервную копию оригинальной библиотеки.
Данную библиотеку необходимо поместить в следующую папку:
- для 32-х разрядных систем Windows :  %SYSTEMROOT%\System32
- для 64-х разрядных Windows :  %SYSTEMROOT%\SysWOW64
Замену нужно выполнить только на тех местах, где установлен Лоцман клиент.
Во вложении 2 версии, нужно проверять с какой из них заработает.

Chaa

Цитата: NONE_NAME от 03.11.21, 15:37:07Это, как я понимаю, позволяет определить пиковые значения потребления виртуальной памяти, но не решит проблемы. Какие есть варианты действий после этого?
Для начала нужно определиться, что проблема именно с потреблением памяти.
Если это так, то потом можно попытаться использовать GC.Collect перед вызовом GetDataSet, чтобы был свободен максимум памяти.