Ошибка insufficient memory for this

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

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

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

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


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


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

Запрашиваются небольшие порции данных. По каждому объекту запрашиваются или список атрибутов, или связанные объекты, по связям запрашиваются свойства (Properties) или атрибуты.
Но даже если так, то почему из двух по прочим параметрам равных машин, на одной и той же сборке спотыкается та, у которой больше оперативной памяти. В чем может крыться принципиальная разница этих двух машин, если не в настройках BDE?


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

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

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



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

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

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

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


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

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


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


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

Для начала нужно определиться, что проблема именно с потреблением памяти.
Если это так, то потом можно попытаться использовать GC.Collect перед вызовом GetDataSet, чтобы был свободен максимум памяти.


  • Форум пользователей ПО АСКОН

  • Профессиональные вопросы

  • Программирование приложений

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


Insufficient memory for this operation ($2501)
Ошибка: ваша программа (или другая программа, использующая BDE) исчерпала всю память
доступную BDE.

    Решение:
    1) Закройте все программы использующие BDE.
    2) Найдите программу BDEADMIN.EXE. Обычно она располагается в «Program
FilesBorland…».
    3) Запустите BDEADMIN.EXE и перейдите на закладку Configuration.
    4) В дереве должен быть элемент «Configuration». Если он не раскрыт,
то раскройте его.
    5) Затем раскройте элемент «System». В нем выберите «INIT».
    6) На правой панели найдите элемент «SHAREDMEMSIZE». Поменяйте его значение
на 4096.
    7) Затем в главном меню нажмите «Object» и «Apply».
    8) Нажмите «OK» на вопрос «Save all edits…».
    После этого попробуйте запустить программу снова. Если проблема повторяется,
то измените значение SHAREDMEMSIZE на 4096 и SHAREDMEMLOCATION на 5BDE. После изменения
значений запустите еще раз вашу программу. Если и после этого она не запускается,
то поменяйте SHAREDMEMSIZE на 8192. Если ошибка повторяется, то поменяйте SHAREDMEMLOCATION
на 6BDE. Если ничего не получилось, то попробуйте другие значения SHAREDMEMLOCATION,
следуя нижеследующим инструкциям.


Shared memory conflict ($210D)
Ошибка: BDE пытается использовать область в памяти, которая уже используется операционной
системой или другой программой.

    Решение:
    1) Закройте все программы использующие BDE.
    2) Найдите программу BDEADMIN.EXE. Обычно она располагается в «Program
FilesBorland…».
    3) Запустите BDEADMIN.EXE и перейдите на закладку Configuration.
    4) В дереве должен быть элемент «Configuration». Если он не раскрыт,
то раскройте его.
    5) Затем раскройте элемент «System». В нем выберите «INIT».
    6) На правой панели найдите элемент «SHAREDMEMLOCATION». Поменяйте его
значение на 5BDE.
    7) Затем в главном меню нажмите «Object» и «Apply».
    8) Нажмите «OK» на вопрос «Save all edits…».
    Другие возможные значения: 1000, 7000, 7F00. Если ни одно из указанных
значений не устраняет проблему, то попробуйте 2000, 3000, 4000 и т.д. или другие
значения в зависимости от типа операционной системы:
Windows 95/98: SHAREDMEMLOCATION от 9000 до FFFF
Windows NT/2000: SHAREDMEMLOCATION от 1000 до 7F00.


Insufficient shared memory available ($251E)
Ошибка: вашей программе недостаточно памяти для BDE.

    Решение:
    Попробуйте решения из описанных выше случаев.

72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

1

05.07.2010, 18:54. Показов 12591. Ответов 22


Студворк — интернет-сервис помощи студентам

чувствую вопрос надо искать в этом разделе =)

подскажите, пожалста, что сделать, чтоб не было ошибки «недостаточно памяти для завершения даннойоперации» ????

код оч длинный, но ошибка стала появляться, пока он ещё был коротенький. когда в работающем приложении много кнопок понажимаю….

может быть дело в компьютере, а не в самом коде????



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

05.07.2010, 19:33

2

Ksenya100, это вам БДЕ плачется, порешать эту беду уже никак не получится… лучше сменить базу данных



1



КотЪ

219 / 219 / 60

Регистрация: 26.05.2009

Сообщений: 688

05.07.2010, 19:39

3

Возможно вы динамически создаёте множество объектов и не освобождаете память, когда они уже не нужны.

Добавлено через 1 минуту

Не по теме:

Не видел предыдущего поста )



1



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

06.07.2010, 10:28

 [ТС]

4

а что сделать, чтоб память автоматически освобождалась??



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

06.07.2010, 10:32

5

Ksenya100, понимаете, в чем беда… БДЕ уже давно не сопровождается, многие баги только задокументированы и исправлению не подлежат, просто никому это не надо… перезапуск программы обычно помогает, но иногда бывают ситуации, что только ребут



0



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

06.07.2010, 10:48

 [ТС]

6

помогает… но чезез некоторое время опять так же себя ведет =))
хотела, чтоб он так не делал..
это имеет какое-то негативноые последствия??



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

06.07.2010, 11:04

7

Ksenya100, во-первых, случаи возниконовения этого исключения можно свести к минимуму, если корректно работать с базой, у вас часом при работе не появляются временные таблицы с такими примерно названиями — _Q*.DBF



1



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

06.07.2010, 11:15

 [ТС]

8

раньше не появлялись, а сейчас… их много
это значит я совсем нуб ?? =)))



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

06.07.2010, 11:24

9

Ksenya100, нет, это значит, что у вас идет некорректная работа с базой, тобишь вы открываете таблицы, выполняете запросы на выборку, но не закрываете их, что приводит к порождению этих временных таблиц, переполнению памяти и падению самой проги… по-хорошему, после корректного завершения работы программы этих файлов быть не должно вообще



1



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

06.07.2010, 11:29

 [ТС]

10

это значит где-то в программе забыла написать Query.Close ??



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

06.07.2010, 11:31

11

Ksenya100, или Table.Close… в общем на каждый Open должен быть Close — это первая заповедь при работе с БДЕ



0



Ksenya100

72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

06.07.2010, 18:01

 [ТС]

12

если не жму debug — Toogle Breakpoint, все нормально (но мне надо, чтоб проверить как формируется запрос)

а временные таблицы появляюся после этого

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 procedure TForm1.SpeedButton1Click(Sender: TObject);
var ready:string;
begin
Form2.Table1.Active:=False;
Form2.DBGrid1.DataSource:=Form2.DataSource1;
if OpenDialog1.Execute then begin
Form2.Table1.TableName:=OpenDialog1.FileName;
  Form2.Table1.Active:=True;
  Form2.Label2.Caption:= '';
ready:= ChangeFileExt(ExtractFileName(Form2.Table1.TableName), '');
Form2.Label1.Caption:=ready;
Edit1.Text:=ready;
Query1.Close;
Query2.Close;
Query3.Close;
Query4.Close;
Query1.SQL.Text:='select distinct obj_code from '+ready;
Query2.SQL.Text:='select distinct region from '+ready;
Query3.SQL.Text:='select distinct gear_code from '+ready;
Query4.SQL.Text:='select distinct vessel from '+ready;
Query1.Open;
Query2.Open;
Query3.Open;
Query4.Open;
Combobox1.Clear;
Query1.First;
While not Query1.Eof do
begin
Combobox1.Items.Add(Query1.FieldByName('obj_code').AsString);
Query1.Next;
end;
Form2.Query1.SQL.Clear;
Form2.Query1.SQL.Add('select * from '+ ready +' where  ') ;
end
else  Exit;
end;

чтоб мне сделать, чтоб они не появлялись????

Добавлено через 10 минут
не, дело не в Toogle Breakpoint и не во временных таблицах (там одна появляется только….)



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

07.07.2010, 13:33

13

Ksenya100, строки 21-24 куча открытых запросов, где они закрываются7



0



КотЪ

219 / 219 / 60

Регистрация: 26.05.2009

Сообщений: 688

07.07.2010, 13:56

14

Вообще как-то странно, сначала идёт закрытие запросов, потом открытие

Добавлено через 1 минуту
Кроме того, я не вижу, чтоб переменной ready что-то присваивалось перед тем, как она будет использоваться…



0



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

07.07.2010, 16:13

 [ТС]

15

ready у меня там раньше описывается. тут всё в порядке

вот не могу в правильное место вставить Query.Close
либо таблицы временные не удаляются, либо запрос не хочет выполняться =))))
сейчас буду думать……

можете что-нибудь посоветовать, пока думаю



0



Zabiyak

КотЪ

219 / 219 / 60

Регистрация: 26.05.2009

Сообщений: 688

07.07.2010, 18:31

16

1) Если ready описывалась раньше, то зачем вы снова её объявляете в разделе var приведённой процедуры? Она у вас локальной должна быть или глобальной?
2) Насколько я понимаю, структура должна быть такова

Delphi
1
2
3
Query1.Open;
// Чего-то там делаете с этим Query1
Query1.Close;



0



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

08.07.2010, 13:49

 [ТС]

17

ну с open и close всё устаканила — табл. не остаются.
но иногда всё же выходит то же сообщение… наверное это когда при компиляции обнаруживаютя ошибки (не мало =)) ) и когда я меняю что-то, добавляю во время работы пр. — наверное delphi не нравится, когда ты не умный и делаешь всё эмпирическим методом =)))))))))



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

08.07.2010, 15:33

18

Ksenya100, ну я вам еще в самом начале писал. что можно минимизировать частоту появления этого сообщения, но избавиться от него окончательно уже просто невозможно



1



72 / 64 / 3

Регистрация: 13.05.2010

Сообщений: 349

08.07.2010, 17:46

 [ТС]

19

это плохо?? =)



0



Супер-модератор

8783 / 2536 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

08.07.2010, 18:12

20

Ksenya100, ну если у вас существуют ситуации, когда программа будет падать без каких-либо видимых причин — это хорошо?



0



Цитата

решение проблемы перезапуск среды программирования и закрытие всех программ которые используют таблицы

Не только.

Во-первых, PDOXUSRS.NET может быть причастен к данной ошибке только если программа завершилась некорректно, если завершение программы было нормальным — PDOXUSRS.NET ни при чем, он не должен сохранять блокировку.

Во-вторых, если все-таки произошло некорректное завершение программы — только закрытия всех программ, использующих данную таблицу будет недостаточно. Для решения проблемы может понадобиться удалить файл PDOXUSRS.NET, что может потребовать дополнительные действия, вплоть до перезагрузки компьютера (сам этот файл может быть залочен).

Но мне кажется, что не надо пока ходить так далеко. Лучше покажи, как именно ты добавляешь записи в таблицу, и что происходит с момента добавления записи до момента закрытия программы. Начни с создания тестового проекта. Только добавление записей, ничего лишнего. Попробуй добавить что-то в таблицу, закрыть программу, открыть снова и попробовать обратиться к добавленной на предыдущем шаге записи.

P.S. Но я сразу говорю, во всем, что касается Парадокса — я могу помочь только теоретически, правтически проверять теперь негде. Когда-о давно, еще на Д6, я использовал BDE, но прошло очень много времени, и я перебрался на ADO (базы с доступом BDE уже не развивается, чего о базах, использующих ADO не скажешь smile.gif ). Я понимаю, что есть учебная программа, но… Помочь практически ничем не смогу. Только то, с чем сталкивался когда-то сам.

I have an application developed in Delphi 5 that uses BDE to access the SQL Server database. This application normally ran on a Windows Server 2012.

The product has undergone an infrastructure change, and now runs on other 64-bit Windows Server 2012 and 2016 VMs (previous machines no longer exist). From this change customers began reporting the error:

Insufficient memory for this operation.

All customers report that previously the problem did not occur.

Important! This error only occurs when selecting a large number of records. For example, a product query that returns more than 45,000 records, with 150 columns, multiple text and 1 blob.

Again, customers claim that this problem did not occur before the change.

I have already run through many blogs, forums, StackOverflow itself, and made many configurations in BdeAdministrator, mainly in the parameters of SHAREDMEMSIZE and SHAREDMEMLOCATION. All possible combinations that I found by Google were tested unsuccessfully. I even installed the EMET tool in an attempt to address the Address Space Layout Randomization (ASLR) problem to no avail.

The default combination: SHAREDMEMSIZE = 4096 and SHAREDMEMLOCATION = 0x5BDE and several others have already been set and had no effect.

Tracking the application execution through the Windows Task Manager, it consumes memory until it reaches 609 Mb when the error happens. I noticed that this memory consumption is the same even with smaller parameters for SHAREDMEMSIZE and SHAREDMEMLOCATION, among other BDE parameters. The application always reaches 609 Mb and the error occurs.

What more could I try to solve this problem? Does anyone have a complementary tip?

I know that BDE is a very (very) old technology, but the system is very large and complex and I can’t currently port to another technology.

Понравилась статья? Поделить с друзьями:
  • Ошибка initializeprintprovider для поставщика localspl dll
  • Ошибка installer user interface mode not supported
  • Ошибка installer is no longer responding
  • Ошибка initialize failed ssdevm dll
  • Ошибка installation has not been detected