On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 6857
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.12.20 20:07. Заголовок: Неисправимая ошибка 9009 или 9006


Прога на большой базе - 71 тыс.записей вылетает вот с такой ошибкой в error.log:
Info: Harbour MiniGUI Extended Edition 20.12.0 (32-bit) 
Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память
Called from DBAPPEND(0)
Called from CREATEMEMTMP(1310) in Demo2.prg
Called from MAIN(109) in Demo2.prg
------------------------------------------------------------------------

Вот выборочный код:
REQUEST HB_MEMIO 
...
DBCREATE( cFileTmp, aStru, cVia, .T., cAlsTmp )
// область cAlsTmp
k := FieldPos( cFld )
FOR i := 1 TO (cAlias)->( LastRec() )
SELECT(cAlsTmp)
APPEND BLANK // строка 1310
FieldPut( k, i )
SELECT(cAlias)
DBGOTO(i)
IF (cAlias)->( DELETED() )
(cAlsTmp)->( DbDelete() )
ENDIF
DO EVENTS
NEXT

Из одной базы копирую записи в новую базу MEMIO
Как с этим бороться / что править ? [img class=smile" src=/gif/smk/sm33.gif]

PS. База создаётся объемом 415 Мб ( пробовал писать на диск) два раза, прога ломается на создании второй базы.
Просто этот пример - продолжение Tsb_VirtualColumn и в этой проге 2 раза создаётся временная база.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]


постоянный участник




Пост N: 6858
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.12.20 20:16. Заголовок: Если делаю копирован..


Если делаю копирование в обычную (временную) базу, то прога вылетает вот по такой ошибке:
Error MGERROR/0 Only Panel windows can be defined inside a DEFINE WINDOW...END WINDOW structure. Program terminated. 
--------------------------------- Stack Trace ---------------------------------
Called from MSGMINIGUIERROR(100) in module: h_error.prg
Called from _DEFINEWINDOW(150) in module: h_windows.prg
Called from WAITWINDOW(2776) in module: h_windows.prg
Called from MYCOLORSINITTEMPDBF(684) in module: Demo2.prg
Called from MYBRW(302) in module: Demo2.prg
Called from MAIN(174) in module: Demo2.prg

По коду совсем непонятно, строка 684 в MYCOLORSINITTEMPDBF(684) вот такая:
      WaitWindow( "Wait, color is being written to dbf file", .T. ) 

PS. База создаётся объемом 415 Мб, но на показе прога ломается.
Как исправить эту ошибку ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1598
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 17.12.20 21:04. Заголовок: Andrey пишет: Неисп..


Andrey пишет:

 цитата:
Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память
....
Из одной базы копирую записи в новую базу MEMIO



Просто кончается память.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6859
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.12.20 21:10. Заголовок: PSP пишет: Просто к..


PSP пишет:

 цитата:
Просто кончается память.


Как можно определить размер доступной памяти для МиниГуи, чтобы уже при старте программы определить какую базу можно создавать ?
Т.е. база MEMIO или база на диске ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3987
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.12.20 21:30. Заголовок: Не надо ничего опред..


Не надо ничего определять.
Хранить таблицу в памяти, которая потенциально может занимать сотни мегабайт не есть хорошее решение.
Причем этот блок памяти для таблицы должен быть одним фрагментом.
Пусть мы имеем таблицу в памяти, и размер блока, в котором она находится, исчерпался
Выдаем dbAppend(), надо перевыделить память. Вызывается xrealloc. Для его отработки надо найти блок памяти больше текущего, и переписать в него содержимое таблицы, и освободить занимаемый блок.
Т.е необходимо иметь свободным двойной размер таблицы, что совсем нехорошо
Память когда-нибудь да исчерпается
Определять свободную память при старте бессмысленно. В любой момент стартанет какой-нибудь браузер, и скушает сотни мегабайт. И не только браузер

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3544
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.12.20 23:29. Заголовок: Andrey пишет Only Pa..


Andrey пишет
 цитата:
Only Panel windows can be defined inside a DEFINE WINDOW...END WINDOW structure. Program terminated


Сообщение говорит о том, что ты не завершив создание окна по END WINDOW начинаешь создавать др. окно и оно не Panel.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6860
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.12.20 00:31. Заголовок: SergKis пишет: Сооб..


SergKis пишет:

 цитата:
Сообщение говорит о том, что ты не завершив создание окна по END WINDOW начинаешь создавать др. окно и оно не Panel.


Спасибо !
Понял что при малых ДБФ это не важно, главное окно успевает про рисоваться, а если БД большие, то не успевает.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6863
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.12.20 14:32. Заголовок: Мучаю пример MiniGUI..


Мучаю пример MiniGUI\SAMPLES\Advanced\Tsb_VirtualColumn\demo1.prg
Поставил базу 266 Mb, 930 полей - пример вылетает с ошибкой:
Info: Harbour MiniGUI Extended Edition 20.12.0 (32-bit)  
Неисправимая ошибка 9006: hb_xgrab не может распределить память
Called from ARRAY(0)
Called from MYCOLUMNINIT(404) in Demo1.prg
Called from MYBRW2(263) in Demo1.prg
Called from MAIN(142) in Demo1.prg

Вылетает на втором этапе при создании массива размером 71000х930

Поставил поменьше базу demoAb.dbf ( 133 Mb, 930 полей) - пример работает !
Массив размером 35000х930

А можно как то отловить нехватку памяти при создании массива и выдать ошибку ?

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1440
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 18.12.20 14:44. Заголовок: Попробуйте Memory( n..


Попробуйте Memory( n ) для проверки доступной памяти. Вот возможные параметры:
 
#define HB_MEM_CHAR 0 /* Free Variable Space (KB) */
#define HB_MEM_BLOCK 1 /* Largest String (KB) */
#define HB_MEM_RUN 2 /* RUN Memory (KB) */

/* CA-Cl*pper undocumented */
#define HB_MEM_VM 3 /* Virtual Memory (KB) */
#define HB_MEM_EMS 4 /* Free Expanded Memory (KB) (?) */
#define HB_MEM_FM 101 /* Fixed Memory/Heap (KB) (?) */
#define HB_MEM_FMSEGS 102 /* Segments in Fixed Memory/Heap (?) */
#define HB_MEM_SWAP 103 /* Free Swap Memory (KB) */
#define HB_MEM_CONV 104 /* Free Conventional (KB) */
#define HB_MEM_EMSUSED 105 /* Used Expanded Memory (KB) (?) */

/* Harbour extensions */
#define HB_MEM_USED 1001 /* Memory used (bytes) */
#define HB_MEM_USEDMAX 1002 /* Maximum memory used (bytes) */
#define HB_MEM_STACKITEMS 1003 /* Total items on the stack */
#define HB_MEM_STACK 1004 /* Total memory size used by the stack (bytes) */
#define HB_MEM_STACK_TOP 1005 /* Total items currently on the stack */
#define HB_MEM_BLOCKS 1007 /* Total number of memory blocks allocated */
#define HB_MEM_STATISTICS 1008 /* Return non 0 value if FM statistic is enabled */
#define HB_MEM_CANLIMIT 1009 /* Return non 0 value if used memory limit is supported */

Может, какие-нибудь подойдут для оценки.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1441
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 18.12.20 14:48. Заголовок: И не забывайте "..


И не забывайте "сборку мусора" делать во время длительных процессов (hb_gcAll(), hb_gcStep()), это иногда спасает от переполнения памяти.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3545
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.12.20 15:02. Заголовок: Andrey пишет Вылетае..


Andrey пишет
 цитата:
Вылетает на втором этапе при создании массива размером 71000х930
Поставил поменьше базу demoAb.dbf ( 133 Mb, 930 полей) - пример работает !
Массив размером 35000х930


На мой взгляд, это лишено смысла давать таблицу в просмотр из 71000 и 35000 записей.
1000 записей на экране трудно отследить, а тут ...
Выборки надо делать, разрезы, как по строкам, так и по колонкам. Просто делать scroll влево\вправо на 930 колонок офигеешь, что то найти глазами. А сборку мусора можно вставлять перед созданием окон.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3546
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.12.20 15:18. Заголовок: PS Или не пытаться з..


PS
Или не пытаться забивать все в память, а работать через диск

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3988
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.12.20 16:41. Заголовок: Вылетает на втором э..



 цитата:
Вылетает на втором этапе при создании массива размером 71000х930

Поставил поменьше базу demoAb.dbf ( 133 Mb, 930 полей) - пример работает !
Массив размером 35000х930

А можно как то отловить нехватку памяти при создании массива и выдать ошибку ?



Это же опять сотни мегабайт, если не гигабайты. Хоть и не одним фрагментом.
Не надо отлавливать количество памяти. Любой инструмент надо использовать по назначению, если не хочется его сломать

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3989
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.12.20 18:54. Заголовок: Для понимания: разме..


Для понимания: размер элемента HB_ITEM в 32-битной системе - 24 байта.
Для хранения массива 71000х930 необходимо 66030000 таких элементов, каждый по 24 байта,
всего получается более 1.5Г. Это не считая самих данных, плюс служебная информация на каждый блок памяти
Всего получится несколько гигабайт. А зачем ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6864
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.12.20 13:47. Заголовок: SergKis пишет: Выбо..


SergKis пишет:

 цитата:
Выборки надо делать, разрезы, как по строкам, так и по колонкам.
Просто делать scroll влево\вправо на 930 колонок офигеешь, что то найти глазами.


Согласен с этим полностью.
Но у нас же в примере есть справа виртуальные колонки и фильтр по колонке.
Вот фильтр включаешь и смотришь.

Хотя листать 930 колонок то ещё удовольствие.
Наверное нужно делать отдельный показ по нужным колонкам, не нужны же сразу все колонки.
Как правило нужны несколько колонок и всё.

Pasha пишет:

 цитата:
Всего получится несколько гигабайт. А зачем ?


Делал просто пример под задачу сравнения двух dbf и показ отличий в ТСБ.
Думал сделать показ различия строк и колонок цветами, а цвета загнать в массив или во временную базу.

Для небольших баз идеология примера работает на отлично !
Но вот поставил реальные базы, вот тут случился облом.
Я понял, что был неправ со своим подходом.
Но без этих примеров трудно было бы понять, что подход не верен.
Зато теперь знаю !

Pasha пишет:

 цитата:
Любой инструмент надо использовать по назначению, если не хочется его сломать


Заранее не подумал, что не так делаю и какой результат будет на больших базах.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3547
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.12.20 15:07. Заголовок: Andrey пишет Для неб..


Andrey пишет
 цитата:
Для небольших баз идеология примера работает на отлично !
Но вот поставил реальные базы, вот тут случился облом.
Я понял, что был неправ со своим подходом.
Но без этих примеров трудно было бы понять, что подход не верен.


Подход нормальный, если, к примеру, работать по 100 строк, т.е. сравниваешь 100 записей одного dbf со 100 записями другого и если надо добавляешь еще строки в список или очищаешь его и снова добавляешь по 100 строк. Т.е. в списках можешь накапливать обозреваемое ко-во строк (до 500 или 1000) и всегда работать в выборкой, а не полным файлом. А по горизонтали колонки группировать и просматривать выбранную группу

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3549
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.12.20 15:41. Заголовок: PS Можно вместо груп..


PS
Можно вместо группирования колонок использовать маркеры на колонки, прыгать по ним и далее по стрелам ->, <-

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3551
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.12.20 17:32. Заголовок: SergKis пишет Подход..


SergKis пишет
 цитата:
Подход нормальный, если, к примеру, работать по 100 строк, т.е. сравниваешь 100 записей одного dbf со 100 записями другого


Уточнение. Сравнение производим для всего файла, а вот в просмотр берем по 100 строк (цифры итоги в тсб в Footer показываем правильно)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6865
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.12.20 17:52. Заголовок: Понял тебя ! Учту эт..


Понял тебя !
Учту это в следующем примере.

Добиваю этот пример - Demo2.prg.
На реальной базе опять ломается в другом месте:
Неисправимая ошибка 9006: hb_xgrab не может распределить память 
Called from ARRAY(0)
Called from MYCOLUMNINIT(412) in Demo2.prg
Called from MYBRW(339) in Demo2.prg
Called from MAIN(192) in Demo2.prg

По коду для удобства вывода итогов было сделано так:
// инициализация колонок таблицы для фильтра/итого по вирт.колонкам 
STATIC FUNCTION myColumnInit( oBrw )
LOCAL oCol

WITH OBJECT oBrw
FOR EACH oCol IN :aColumns // Init Cargo в колонке
oCol:Cargo := oKeyData()
oCol:Cargo:nSum := 0
oCol:Cargo:aVirt := Array((:cAlias)->( LastRec() )) // строка 412
AFill(oCol:Cargo:aVirt, 0)

Наверное это нужно убрать для этого случая и
использовать итого только для виртуальных колонок, чтобы не налетать на

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1601
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.12.20 20:53. Заголовок: Andrey пишет: oCol:..


Andrey пишет:

 цитата:
oCol:Cargo:aVirt := Array((:cAlias)->( LastRec() )) // строка 412
...
Наверное это нужно убрать для этого случая и


Нужно придумать другой алгоритм, в котором не будет использования массивов и memio.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6866
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.12.20 16:44. Заголовок: PSP пишет: Нужно пр..


PSP пишет:

 цитата:
Нужно придумать другой алгоритм, в котором не будет использования массивов и memio.


Ну это сложно сделать без массивов.
Тем более memio вроде классная штука, только пользоваться её надо научиться.
Я понял, что большие базы делать не надо, а делать как Сергей советует небольшие базы.

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

Рабочий пример, не вылетающий на моих рабочих базах - выслал Григорию для библиотеки.
Попробовать пример можно с любыми базами - Demo2.exe Test.dbf

Но это пример просто учебный с двумя ТСБ и виртуальными колонками,
реальный пример для сравнения баз пока только делаю.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3990
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.12.20 17:06. Заголовок: Andrey пишет: Делал..


Andrey пишет:

 цитата:
Делал просто пример под задачу сравнения двух dbf и показ отличий в ТСБ.
Думал сделать показ различия строк и колонок цветами, а цвета загнать в массив или во временную базу.



У меня в утилите dbedit как раз есть функция сравнения двух dbf, без использования промежуточного массива.
Там цикл по первому dbf, сравнение каждой записи со вторым с записью различий в выходной массив. В массив заносятся только различия

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3554
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.12.20 18:14. Заголовок: Pasha пишет Там цикл..


Pasha пишет
 цитата:
Там цикл по первому dbf, сравнение каждой записи со вторым с записью различий в выходной массив. В массив заносятся только различия


У Андрея не программа сравнения, а скорее два цветных отчета (таблицы) на одном окне с 6-ю запросами к одной базе, которые результат помещают в новые виртуальные колонки (6 штук можно больше делать), обозначая цветами, в соответствии с данными и алгоритмами, каждой колонки. По виртуальным полям можно фильтровать полученный результат как по одной колонке, так и по всем с получением соответствующих итогов, работая на 2-х таблицах.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6867
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.12.20 20:59. Заголовок: SergKis пишет: У Ан..


SergKis пишет:

 цитата:
У Андрея не программа сравнения, а скорее два цветных отчета (таблицы) ...



Да это точно. Просто нужно юзеру показать различия допустим текущей базы и что было несколько месяцев назад.
А то вечно стенания, то данные пропали, то никто данные не трогал, а они другие и т.д.
Да и самому понятней становиться когда перед глазами изменения, как в WinMerge.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1602
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 20.12.20 21:12. Заголовок: Andrey пишет: Ну эт..


Andrey пишет:

 цитата:
Ну это сложно сделать без массивов.
Тем более memio вроде классная штука, только пользоваться её надо научиться.


Каждый инструмент имеет ограниченный круг применения. Даже самой дорогой золотой ложкой траншею трудно выкопать. Сломается))

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3555
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.12.20 22:03. Заголовок: Andrey пишет Просто ..


Andrey пишет
 цитата:
Просто нужно юзеру показать различия допустим текущей базы и что было несколько месяцев назад


Это частный случай, более общий, на мой взгляд, получение данных за периоды по 6 показателям (можно больше) для сравнения, например прошлый месяц (1 таблица тсб) и текущий (2 таблица тсб), прошлый год и тек. год, кварталы, и т.д. для анализа и сравнения

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3991
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.12.20 08:01. Заголовок: В конце концов, есть..


В конце концов, есть же диспетчер задач. Достаточно оценить, сколько программа берет памяти в спокойном состоянии, пусть это будет 10-20М,
и в возбужденном. Если память будет зашкаливать, это значит, что "что-то я делаю не так"

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет