Автор | Сообщение |
|
| |
Пост N: 200
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 15:50. Заголовок: Сборщик мусора / очистка памяти
Первые два рабочих дня "новой" программы помимо ожидаемых ошибок, связанных с "длинными" именами переменных/функций принесли пару-тройку ситуаций, в которых я ничего не могу понять. Общий смысл таков, что в некоторых местах, связанных с интенсивными расчетами (напр. подгтовка прайс-листа на 5-6 тысяч наименований, сложная комбинированная работа с разными таблицами одновременно и тп) приводит к совершенно непредсказуемым результатам: - пропадают надписи в SAY в панели с несколькими GET - программа вылетает/виснет - программа неожиданно начинает пытаться открыть документ Word/Excel а то и несколько... Осмысленного объяснения этому процессу дать не могу, поскольку связи с кодом нет точно. Во всяком случае, Clipper в этих местах работал (но зато без звука вылетал в других и намного чаще). На одной машине даже поймал вот такой отчет: --- Application Internal Error - D:\tradewin.exe Terminated at: 2013.08.23 12:12:31 Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память Called from AADD(0) Called from CRLIST(187) in trade206.prg Called from ADDR2QUEUE(124) in trade206.prg Called from SALE2QUEUE(209) in trade206.prg Called from MAKESALEDOCS(1816) in trade224.prg Called from SALECONT2(593) in trade224.prg Called from DBVIEW2(4807) in trade225.prg Called from DO(0) Called from ACHOICE(0) in ../../../achoice.prg Called from DBVIEW(4784) in trade225.prg Called from SALECONTROL(272) in trade224.prg Called from CHECK4DAMAGE(963) in trade.prg Called from MAIN(234) in trade.prg ------------------------------------------------------------------------ в Clipper я использовал в критичных местах шаманства наподобие MEMORY(-1) и FT_IamIdle() В Harbour я естественно их убрал - полагал, что там, где раньше почти хватало 16 мегов памяти, в 1-2 гигабайтах будет где развернуться без проблем. Похоже, что это не так. Что нужно использовать для Harbour и в каких случаях ?
|
|
|
Ответов - 67
, стр:
1
2
3
4
All
[только новые]
|
|
|
| |
Пост N: 3450
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 16:03. Заголовок: Сама задача сетевая ..
Сама задача сетевая ? Сколько юзеров сразу ее топчет ? Свою задачу я перевел в конце апреля и глюки конечно были но они все мои , но что бы происходило то что у тебя такого не было ни разу. Sergy пишет: Большой массив ?
|
|
|
|
| |
Пост N: 201
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 16:16. Заголовок: 1) Задача разумеется..
1) Задача разумеется сетевая 2) в сети работает от 15 до 25 чел в среднем 3) массив копеечный - 20-30 элементов максимум - id заказов, которые будут погружены в автомобиль, осуществляющий доставку.
|
|
|
|
| |
Пост N: 3451
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 16:20. Заголовок: Sergy пишет: 1) Зад..
|
|
|
|
| |
Пост N: 202
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 16:24. Заголовок: Dima пишет: И это в..
Dima пишет: цитата: | И это все без сервера баз данных типа ADS , LETO ? Индексы видимо NTX ? |
| ага Но Clipper ведь работал. Кряхтел, но работал... А тут просто все залетало, но вот эти необъяснимые вещи меня напрягают.
|
|
|
|
| |
Пост N: 3452
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 16:28. Заголовок: 15 чел это шибко мно..
15 чел это шибко много без СБД. Ошибки и глюки будут 100 % и не потому что твой код кривой. Сетка видать перегружена по самое не хочу отсюда и потеря данных возможна и многое другое что ты сейчас и наблюдаешь
|
|
|
|
| |
Пост N: 3453
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 16:36. Заголовок: Темку листани (у чел..
|
|
|
|
| |
Пост N: 203
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:33. Заголовок: Dima пишет: 15 чел ..
Dima пишет: цитата: | 15 чел это шибко много без СБД. Ошибки и глюки будут 100 % и не потому что твой код кривой. Сетка видать перегружена по самое не хочу отсюда и потеря данных возможна и многое другое что ты сейчас и наблюдаешь |
| Сетка 100 Mbit на 50% парка и 1Gbit на остальных. Проблем со скоростью нет. Логичное замедление некоторых операций пропорционально росту юзеров. Но в любом случае быстрее, чем Clipper. Dima пишет: Понятное дело, что SQL архитектура лучше. До нее тоже дойдет дело. Вопрос на сегодня в том, что делать именно сейчас и именно с DBFNTX драйвером.
|
|
|
|
| |
Пост N: 3454
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 17:36. Заголовок: Sergy пишет: и имен..
Sergy пишет: цитата: | и именно с DBFNTX драйвером |
| Чего так уперся в DBFNTX , нравятся "толстые" индекcы ? ;) Сейчас можно попробовать сервер терминалов или все же заюзать СБД (LETO или ADS) Базы индексировал после того как на Harbour пересел ?
|
|
|
|
| |
Пост N: 204
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:41. Заголовок: Dima пишет: Чего та..
Dima пишет: цитата: | Чего так уперся в DBFNTX , нравится ? |
| Сильно завязано все на индексы и оптимизировано. Во многих местах разбросаны проверки наличия *.ntx файлов. Перейти на CDX возможно, но нет уверенности, что это закроет вопросы. Понятно, что радикально лучше будет перейти на SQL, но даже не представляю себе объем переписываемого кода. Чую, это будет полная Ж... цитата: | Сейчас можно попробовать сервер терминалов или все же заюзать СБД (LETO или ADS) |
| Под терминалом работают в среднем 5-10 клиентов. База получается локальной. Вообще красота. цитата: | Базы индексировал после того как на Harbour пересел ? |
| Разумеется. Harbour с Clipper ntx вообще не дружит никак - вылетает сразу на попытке открыть даже для чтения.
|
|
|
|
| |
Пост N: 3455
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 17:43. Заголовок: Sergy пишет: Перейт..
Sergy пишет: С CDX думается будет гиморойчик по началу. Да впал тебе этот SQL , думаешь он быстрее будет чем LETO или ADS , врядли ? Так что вариантов два вижу LETO+NTX , ADS+NTX
|
|
|
|
| |
Пост N: 205
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:44. Заголовок: Dima пишет: Да впал..
Dima пишет: цитата: | С CDX думается будет гиморойчик по началу. |
| Вот поэтому и не очень охота заниматься сизифовым трудом. Хендлов файловых будет меньше ненамного - больше двух индексов к одной табоице у меня не бывает. Итого 72шт DBF и 84шт NTX. В среднем открыто 5-10 таблиц + индексы к ним. Половина из этого - на локальном компе (справочники имен/цен/контрагентов, которые меняются редко). Все временные файлы создаются тоже исключительно локально. цитата: | Да впал тебе этот SQL , думаешь он быстрее будет чем LETO или ADS , врядли ? |
| Под SQL я имел ввиду как раз LETO и ADS - клиент/серверные варианты.
|
|
|
|
|
| |
Пост N: 3456
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 17:45. Заголовок: я думал ты о Microso..
я думал ты о Microsoft SQL серве и тд и тп ;) По ходу не так много и переделывать что с LETO что с ADS. Если нужен тупо "быстрый старт" то вся переделка это с 10-к строчек кода а потом уже можно заниматься оптимизацией и наворачивать используя спец функции из этих обоих серверов баз данных
|
|
|
|
| |
Пост N: 206
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:49. Заголовок: Dima пишет: По ходу..
Dima пишет: цитата: | По ходу не так много и переделывать что с LETO что с ADS |
| Я понимаю их преимущества. И обязательно перейду на что-то из этого. Но сейчас - явно не то время. Так что со сборкой мусора? Никто на Harbour ее не использует?
|
|
|
|
| |
Пост N: 3457
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 17:49. Заголовок: Sergy пишет: Все вр..
Sergy пишет: цитата: | Все временные файлы создаются тоже исключительно локально |
| Их можно исключительно в памяти создавать юзая HBMEMIO Sergy пишет: цитата: | Так что со сборкой мусора? Никто на Harbour ее не использует? |
| Да он сам чудно справляется с это задачей.
|
|
|
|
| постоянный участник
|
Пост N: 229
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.08.13 17:51. Заголовок: Sergy На мой взгляд ..
Sergy На мой взгляд проще LetoDb не будет. LetoDb поддерживает NTX, базовые команды RDD NTX не изменятся, возможно поработать придется над проверками наличия файлов, вместо file(...) использовать leto_file(...), начать с этого, а потом, если надо перейти на CDX индексы в LetoDb
|
|
|
|
| |
Пост N: 207
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:57. Заголовок: Dima пишет: Их можн..
Dima пишет: цитата: | Их можно исключительно в памяти создавать юзая HBMEMIO |
| Немного непонятно, что это даст ? Есть код, который выводит, к примеру, отчет. Создается локально файл temp.dbf и в него загружаются данные на основе таблицы, к примеру, продаж и текущих остаков. Анализируются, выводится документ, временный dbf стирается. Или я чего-то не понял...
|
|
|
|
| |
Пост N: 208
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 17:58. Заголовок: SergKis пишет: На м..
SergKis пишет: цитата: | На мой взгляд проще LetoDb не будет. LetoDb поддерживает NTX, базовые команды RDD NTX не изменятся, возможно поработать придется над проверками наличия файлов, вместо file(...) использовать leto_file(...), начать с этого, а потом, если надо перейти на CDX индексы в LetoDb |
| На выходных готов начать разбираться. Есть тема "для чайников" по переходу с DBFNTX на Leto ?
|
|
|
|
| |
Пост N: 3458
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 18:01. Заголовок: Sergy пишет: Есть т..
Sergy пишет: цитата: | Есть тема "для чайников" по переходу с DBFNTX на Leto ? |
| Нет , но если скачать сырцы то там все есть в readme_rus.txt. Сча налью куда нить Во http://zalil.ru/34691922 Sergy пишет: цитата: | Создается локально файл temp.dbf |
| А в случае с HBMEMIO этот файл создается в оперативной памяти
|
|
|
|
| |
Пост N: 209
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 18:03. Заголовок: Dima пишет: Да он с..
Dima пишет: цитата: | Да он сам чудно справляется с это задачей. |
| Значит буду пока развязывать узелки. Вот странная картина. При запуске на каждой машине увеличивается переменная err_count на единицу. При корректном завершении - уменьшается на единицу и сохраняется в mem-файле. Т.е. я могу совершенно точно определить, на какой из машин большее кол-во проблем. В сети есть три машины, на которых идет наиболее интенсивная и разнообразная работа. Счетчик ошибок на них за 2 полных рабочих дня увеличилися с 0 (при переходе на Harbour я обнулил) до 12...15. Т.е. значит что 12-15 раз эти машины "вылетали" по тем или иным причинам. В среднем это в 2 раза меньше чем в Clipper, но все равно имеет место быть... Вроде и архитектура изменилась и почти вся физическая память доступна, ан нет... Не знаю, что делать, аж бесит блин...
|
|
|
|
| |
Пост N: 210
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 18:06. Заголовок: Dima пишет: Нет , н..
Dima пишет: цитата: | Нет , но если скачать сырцы то там все есть в readme_rus.txt. Сча налью куда нить |
| Слил цитата: | А в случае с HBMEMIO этот файл создается в оперативной памяти |
| Но что это дает ? Проблем со скоростью обработки локальных данных не было и в Clipper под NTVDM. Винда ведь кэширует все что можно и нельзя. В программе даже есть опция - "сделать локальное зеркало". Тупо копируются все таблицы в локальный каталог и переключается работа на него. Менеджеры, которым нужно сделать много отчетов именно так и поступают.
|
|
|
|
| |
Пост N: 3459
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 18:12. Заголовок: Sergy пишет: Но что..
Sergy пишет: Работа с базой будет быстрее если она живет на харде или живет в памяти , как думаешь ? ;) Я говорю исключительно о временных базах (ну там отчетик создать или еще что)
|
|
|
|
|
| Администратор
|
Пост N: 2949
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.13 18:15. Заголовок: Sergy пишет: 3) мас..
Sergy пишет: цитата: | 3) массив копеечный - 20-30 элементов максимум - id заказов, которые будут погружены в автомобиль, осуществляющий доставку. |
| Точно зацикливания нет ? Харбор тянет сотни тысяч и миллионы элементов массива Local i := 1, a := {} while .t. AADD(a, i++) if i % 1000 == 0 ? i endif enddo у меня свалился с такой же ошибкой 9009 на размере массива 31 млн элементов, при RAM 2GB
|
|
|
|
| Администратор
|
Пост N: 2950
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.13 18:20. Заголовок: Sergy пишет: Так чт..
Sergy пишет: цитата: | Так что со сборкой мусора? Никто на Harbour ее не использует? |
| Никогда специально не использовал, неявная сборка мусора справляется. Если появляются ошибки типа 900x, то это либо баг в стороннем коде (код харбора вылизан донельзя), либо простая причина вроде зацикливания.
|
|
|
|
| |
Пост N: 211
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 18:33. Заголовок: Pasha пишет: Точно ..
Pasha пишет: цитата: | Точно зацикливания нет ? Харбор тянет сотни тысяч и миллионы элементов массива |
| Совершенно точно. Эта операция повторяется в среднем 100-200 раз в день на многих машинах. Оператор пробил заказ - ставит его на доставку. Выбирает машину, указывает адрес клиента из списка. Эта функция возвращает список id заказов, которые находятся в этой машине. так что там миллион не получится никак.
|
|
|
|
| |
Пост N: 212
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 18:37. Заголовок: Pasha пишет: код ха..
Pasha пишет: цитата: | код харбора вылизан донельзя |
| После вчерашних мытарств с банальным SETKEY и HB_SETKEY я в этом не особо уверен.
|
|
|
|
| |
Пост N: 213
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 18:56. Заголовок: Dima пишет: Работа ..
Dima пишет: цитата: | Работа с базой будет быстрее если она живет на харде или живет в памяти , как думаешь ? ;) |
| Думаю, что под Windows ощутимой разницы не будет. В случае "харда" эта таблица целиком поместится в кэш-памяти. Тормозом для таких операций будет все равно не локальная таблица, куда собираются данные для отчета, а удаленная - из которой они выбираются.
|
|
|
|
| постоянный участник
|
Пост N: 908
Зарегистрирован: 27.01.07
|
|
Отправлено: 23.08.13 18:59. Заголовок: Sergy пишет: Called..
Sergy пишет: цитата: | Called from CRLIST(187) in trade206.prg |
| А что тут происходит?
|
|
|
|
| |
Пост N: 214
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 19:01. Заголовок: PSP пишет: А что ту..
PSP пишет: Вроде ниче криминального: Скрытый текст
FUNC CRList(dDate) // -> {dDate,{id маршрутов},{описания маршрутов}} LOCAL area,res,sx res := {dDate,{},{}} area:=SELECT() SELECT caroute SEEK DTOS(dDate) DO WHILE (caroute->date == dDate) IF caroute->vault sx := caroute->id+" "+Vault(caroute->date,"CR"+caroute->id,,"") // описание задано начальником транспорта ELSE sx := "Маршрут "+caroute->id // описание маршрута не задано, просто номер ENDI AADD(res[2],caroute->id) // id << вот строка 187 AADD(res[3],PADR(sx,25)) // описание SKIP ENDD SELECT(area) RETURN res // {dDate,{ids},{описания}}
| По сути - выбирается список машин на выбранную дату и собираются в небольшой массив: {дата, {id машин}, {описания по этим id: кто куда едет}} Больше в день 10 машин никогда не бывает.
|
|
|
|
| Администратор
|
Пост N: 2951
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.13 19:28. Заголовок: Добавьте где-нибудь ..
Добавьте где-нибудь проверку ! Empty(dDate) или if dbSeek(DTOS(dDate)) у меня давно такие проверки как безусловный рефлекс
|
|
|
|
| |
Пост N: 216
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 19:32. Заголовок: Pasha пишет: Добавь..
Pasha пишет: цитата: | Добавьте где-нибудь проверку ! Empty(dDate) или if dbSeek(DTOS(dDate)) у меня давно такие проверки как безусловный рефлекс |
| ок, попробую
|
|
|
|
| Администратор
|
Пост N: 2952
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.13 22:12. Заголовок: Sergy пишет: ок, по..
Sergy пишет: Если передать этой функции пустую дату, то обязательно произойдет зацикливание. Чтобы его гарантированно избежать, во всех выборках данных надо добавлять: do while ! eof() .and. ...
|
|
|
|
|
| |
Пост N: 217
Зарегистрирован: 08.07.06
|
|
Отправлено: 24.08.13 00:16. Заголовок: Думаю, зацикливание ..
Думаю, зацикливание произойдет в том случае, если не дата пустая, а в таблице не будет записей с датой, большей чем заданная. Надо будет обязательно поставить проверку на eof().
|
|
|
|
| Администратор
|
Пост N: 2953
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.08.13 08:09. Заголовок: Sergy пишет: Думаю,..
Sergy пишет: цитата: | Думаю, зацикливание произойдет в том случае, если не дата пустая, а в таблице не будет записей с датой, большей чем заданная. Надо будет обязательно поставить проверку на eof(). |
| нет, зацикливание будет только при пустой дате SEEK DTOS(dDate) при пустой дате переместит на eof DO WHILE (caroute->date == dDate) при пустой дате указатель уже стоит на eof, и всегда будет .t. это зацикливание при непустой - если дата совпадет, указатель будет перемещаться на следующую запись, а когда достигнет другой даты или eof - будет выход из цикла. зацикливания нет ни при каком случае Неужели Вы за все время программирования на клиппере ни разу не натыкались на такой случай ? У меня это случилось еще на заре использования клиппера, и с тех пор я ни один цикл по таблице без проверки на eof не делаю.
|
|
|
|
| постоянный участник
|
Пост N: 2940
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.08.13 10:06. Заголовок: Sergy пишет: 1) Зад..
Sergy пишет: цитата: | 1) Задача разумеется сетевая 2) в сети работает от 15 до 25 чел в среднем 3) массив копеечный - 20-30 элементов максимум - id заказов, которые будут погружены в автомобиль, осуществляющий доставку. |
|
Sergy пишет: цитата: | Итого 72шт DBF и 84шт NTX. В среднем открыто 5-10 таблиц + индексы к ним. Половина из этого - на локальном компе (справочники имен/цен/контрагентов, которые меняются редко). Все временные файлы создаются тоже исключительно локально. |
| Я свои несколько программ перенес на хХарбор уже лет 5 назад. Программы сетевые, на CDX-индексах, каждая программа открывает примерно 120шт. DBF и 170шт. CDX Каждый юзер на своем компе открывает 3-4 программы и кучу DOC файлов... НУ нравиться им так работать.. Юзеров которые работают с моими программами 10-15 чел., в зависимости от работы. И это не считая 1С и КЛИЕТ-серверной проги на Дельфи. Никто не жалуется из юзеров на скорость и вылет программ. Проблем нет, все работает как часы. Это хХарбор 1.0.0, а что будет при переходе на Харбор - я уже представляю. Так что у тебя простые проблемы при переходе, делай тестировки в узких местах, Харбор более требователен к написанию кода, что и правильней ! Где Клипер работал, не факт что Харбор будет работать. С NTX переходить и необязательно, если времени много, то да конечно можно заняться этим.
|
|
|
|
| |
Пост N: 218
Зарегистрирован: 08.07.06
|
|
Отправлено: 24.08.13 11:08. Заголовок: Pasha пишет: нет, з..
Pasha пишет: цитата: | нет, зацикливание будет только при пустой дате SEEK DTOS(dDate) при пустой дате переместит на eof DO WHILE (caroute->date == dDate) при пустой дате указатель уже стоит на eof, и всегда будет .t. это зацикливание при непустой - если дата совпадет, указатель будет перемещаться на следующую запись, а когда достигнет другой даты или eof - будет выход из цикла. зацикливания нет ни при каком случае |
| Вы абсолютно правы. Сделал тестовый пример с CRList(NIL) - тут-же получил вылет на DTOS(), а вот если сделать CRList(CTOD("")) - тогда получился сначала зависон, выедание 2х гигов оперативки и через секунд 30-40 - вылет с точно таким-же сообщением об ошибке: неспособности перераспределить память. Осталось только понять, как пустая дата могла попасть в эту функцию. цитата: | Неужели Вы за все время программирования на клиппере ни разу не натыкались на такой случай ? У меня это случилось еще на заре использования клиппера, и с тех пор я ни один цикл по таблице без проверки на eof не делаю. |
| Натыкался конечно и всюду ставлю проверку на EOF(). Почему тут так получилось - хз. Помутнение рассудка какое-то... Спасибо за помощь.
|
|
|
|
| |
Пост N: 3461
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.08.13 11:16. Заголовок: Sergy пишет: Остало..
Sergy пишет: цитата: | Осталось только понять, как пустая дата могла попасть в эту функцию |
| Посмотри все вызовы этой функции и что ей передается (вероятно там косяк) В самой функции можно устроить проверку на дату. Если она пуста тогда в цикле можно куда то вывести все Procname , ProcLine что бы понять откуда пришла пустая дата.
|
|
|
|
| |
Пост N: 5546
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.03.16 15:29. Заголовок: Вот такое поймал Неи..
Вот такое поймал Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память Called from DBSEEK(0) Обычный Dbseek Неисправимая ошибка 9009: hb_xrealloc ене может перераспределить память Called from DBAPPEND(0) Это при добавлении записи в MEM: базу Что с этим делать не пойму , вылазит редко.
|
|
|
|
| постоянный участник
|
Пост N: 915
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.03.16 19:35. Заголовок: Обвесь dbAppend() в ..
Обвесь dbAppend() в begin sequnce и цикл Проверь удаление индекса перед открытием mem:... Переведи с mem:.. на temporary, раньше проверял, если в отбор на mem: попадало много записей, то без разницы с mem: или файлом на диске работать
|
|
|
|
| |
Пост N: 5547
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.03.16 22:34. Заголовок: SergKis пишет: Обве..
SergKis пишет: цитата: | Обвесь dbAppend() в begin sequnce и цикл |
| Ты про вариант как с Ddcreate2 тут ? http://clipper.borda.ru/?1-3-0-00000297-000-10001-0-1415683246 Там подход ясен , так как если по сетке создавать базу то нужен контроль. А с MEM: работаю же в оперативе и Exclusive. Временные базы конечно же закрываю и потом "топчу" через Dbdrop с индексами. Записей не много в MEM: базе , 1000 штук всего , размер под 200 кило. Чем надежнее temporary в сравнении с mem: ?
|
|
|
|
| постоянный участник
|
Пост N: 916
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.03.16 22:52. Заголовок: Dima пишет:Ты про ва..
Dima пишет: цитата: | Ты про вариант как с Ddcreate2 |
| Да. Если это случайный сбой, то при повторной попытке может быть ок! Если это с индексом что то (сбой по dbseek) - это хуже и вылет dbappend как следствие этого temporary это файловая работа в temp каталоге с удалением после закрытия, вроде так было для простоты и прояснения ситуации можно и в обчном dbf прокатать
|
|
|
|
| |
Пост N: 5548
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.03.16 23:31. Заголовок: SergKis пишет: Да. ..
SergKis пишет: цитата: | Да. Если это случайный сбой |
| Списал пока на него , буду наблюдать.
|
|
|
|
|
| постоянный участник
|
Пост N: 918
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.03.16 23:55. Заголовок: Dima можно самому в..
Dima можно самому в "тонком" месте вызывать сборщик мусора и продолжать потом раблту
|
|
|
|
| |
Пост N: 5549
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.16 00:01. Заголовок: SergKis пишет: Dima..
SergKis пишет: цитата: | Dima можно самому в "тонком" месте вызывать сборщик мусора и продолжать потом раблту |
| Как определить тонкое место и его вызвать (сборщика мусора) ?
|
|
|
|
| постоянный участник
|
Пост N: 919
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.03.16 00:12. Заголовок: Dima для начала, пе..
Dima для начала, перед dbAppend или каким то рабочим циклом. Я, например перед созданием окна, вызываю сборщика, принудительно, прога им приостанавливается на это время.
|
|
|
|
| |
Пост N: 5550
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.16 17:34. Заголовок: SergKis пишет: Я, н..
SergKis пишет: цитата: | Я, например перед созданием окна, вызываю сборщика |
| Как вызываешь ? Попробовал hb_xfree() , hb_xgrab() , прога не собралась , вероятно они только для вызова из СИ.
|
|
|
|
| постоянный участник
|
Пост N: 1182
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.03.16 18:49. Заголовок: Dima пишет: Попробо..
Dima пишет: цитата: | Попробовал hb_xfree() , hb_xgrab() |
| Это не то. Функции сборщика ( gc - garbage collector) hb_ gcAll(), hb_ gcStep(), hb_ gcSetAuto()
|
|
|
|
| постоянный участник
|
Пост N: 920
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.03.16 18:53. Заголовок: Dima вызываю HB_GCA..
Dima вызываю HB_GCALL() // там параметр отложенный или нет, я без параметров делаю
|
|
|
|
| |
Пост N: 5551
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.16 19:06. Заголовок: Петр SergKis Спасибо..
Петр SergKis Спасибо ! Попробую вызывать его перед созданием MEM: базы и понаблюдаю...
|
|
|
|
| |
Пост N: 5552
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.16 21:32. Заголовок: SergKis пишет: Пере..
SergKis пишет: цитата: | Переведи с mem:.. на temporary |
| MEM: я создаю и открываю сразу с помощью DBCREATE , опции temporary не вижу там , печаль...
|
|
|
|
| постоянный участник
|
Пост N: 921
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.03.16 21:57. Заголовок: Dima завтра найду, ..
Dima завтра найду, сегодня уже башка не варит, не могу найти место где делал
|
|
|
|
| |
Пост N: 5553
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.03.16 21:59. Заголовок: SergKis Хорошо...
SergKis Хорошо.
|
|
|
|
| Администратор
|
Пост N: 3419
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.03.16 08:36. Заголовок: Перевыделение памяти..
Перевыделение памяти (вызов hb_xrealloc) выполняется в функции hb_memfsWriteAt из модуля contrib\hbmemio\memio.c При каждом вызове dbAppend размер файла в памяти увеличивается, значит, как раз идет вызов hb_xrealloc. Старый блок при этом освобождается, следовательно, происходит дефрагментация памяти. Насколько эта дефрагментация критична при современных гигантских объемах памяти, доступных программе - трудно сказать. Мне трудно представить, что программа забила вся память так, чтобы система не смогла ей выделить довольно небольшой (относительно) блок. Можно сделать тест: в цикле делать dbAppend(), и смотреть, сколько итераций выдержит программа. Другая причина такой ошибки - зацикливание программы, но это, как я понимаю, маловероятно.
|
|
|
|
| Администратор
|
Пост N: 3420
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.03.16 09:00. Заголовок: Дополню: если есть п..
Дополню: если есть проблема с дефрагментацией памяти, то сборщик мусора при этом не поможет, так как сборщик мусора освобождает память для переменных, которые уже уничтожены, а не дефрагментирует память. В таком случае надо использовать не файлы в памяти, а временные файл на диске, т.е. создать файл вызовом dbCreate(cName, aStruct, cDrv, .t., cAlias), и после закрытия удалить его.
|
|
|
|
| |
Пост N: 5555
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.16 09:01. Заголовок: Pasha Спасибо что п..
Pasha Спасибо что прояснил
|
|
|
|
| |
Пост N: 5556
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.16 09:26. Заголовок: Pasha Паша а каковы..
Pasha Паша а каковы могут быть причины что программа зависает на QUIT , он же __QUIT() ? У себя повторить не получилось , ловил зависон при входе на удаленный комп через Team Viewer , раз 20. Приложение точно зависает , так как в заголовке окна винда 7 пишет что приложение не отвечает.
|
|
|
|
| постоянный участник
|
Пост N: 922
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.03.16 09:33. Заголовок: SergKis пишет:завтра..
SergKis пишет: hb_dbCreateTemp( <cAlias>, <aStruct>, <cRDD>, <cCodePage>, <nConnection> ) -> <lSuccess> и INDEX ON <key> TAG <(tag)> temporary
|
|
|
|
| |
Пост N: 5557
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.16 09:38. Заголовок: SergKis пишет: <..
SergKis пишет: А это что и для чего ?
|
|
|
|
| постоянный участник
|
Пост N: 923
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.03.16 09:45. Заголовок: Dima этот параметр ..
Dima этот параметр и dbCreate есть, думаю для развития а INDEX ... TAG ... и без temporary будет временный
|
|
|
|
| постоянный участник
|
Пост N: 924
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.03.16 09:46. Заголовок: PS база открывается ..
PS база открывается с заданным алиасом
|
|
|
|
| |
Пост N: 5558
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.16 09:49. Заголовок: SergKis пишет: база..
SergKis пишет: цитата: | база открывается с заданным алиасом |
| да это я тупанул ))
|
|
|
|
| Администратор
|
Пост N: 3421
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.03.16 10:35. Заголовок: Паша а каковы могут ..
цитата: | Паша а каковы могут быть причины что программа зависает на QUIT , он же __QUIT() ? |
| Да по quit выполняется много чего: это и dbCloseAll(), и освобождение памяти, и отработка exit-процедур. В обычной ситуации никаких проблем быть не должно. Я даже не скажу, как определить, деинициализация какого модуля глючит.
|
|
|
|
| |
Пост N: 487
Зарегистрирован: 08.07.06
|
|
Отправлено: 31.03.16 16:48. Заголовок: Dima пишет: Паша а ..
Dima пишет: цитата: | Паша а каковы могут быть причины что программа зависает на QUIT , он же __QUIT() ? У себя повторить не получилось , ловил зависон при входе на удаленный комп через Team Viewer , раз 20. Приложение точно зависает , так как в заголовке окна винда 7 пишет что приложение не отвечает. |
| Я-бы начал с проверки всех самописных EXIT-процедур в программе.
|
|
|
|
| |
Пост N: 5568
Зарегистрирован: 17.05.05
|
|
Отправлено: 31.03.16 17:13. Заголовок: Sergy пишет: Я-бы н..
Sergy пишет: цитата: | Я-бы начал с проверки всех самописных EXIT-процедур в программе. |
| Их нет.
|
|
|
|
| постоянный участник
|
Пост N: 1202
Зарегистрирован: 27.01.07
|
|
Отправлено: 31.03.16 17:51. Заголовок: Dima, а диск на той ..
Dima, а диск на той машине как себя чувствует? Посмотри S.M.A.R.T.
|
|
|
|
| |
Пост N: 5697
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.06.16 09:43. Заголовок: И все же рандомно ви..
И все же рандомно висяк есть в MT приложении при __QUIT() , на разных машинах. Попробовал перед __QUIT() такой код hb_threadDetach( hb_threadStart( HB_THREAD_INHERIT_MEMVARS,@KillMYApl(),1500)) Func KillMYapl(msec) local xs:=hb_MilliSeconds() do while hb_MilliSeconds()-xs<msec hb_releasecpu() enddo hb_threadQuitRequest(Ghpid) // Ghpid указатель главного потока приложения return nil Если на __QUIT() висяк , тогда этот поток не срабатывает хотя и отсоединен. В диспетчере задач винда кажет что приложение висит.
|
|
|
|
| |
Пост N: 5698
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.06.16 21:38. Заголовок: Dima пишет: Если на..
Dima пишет: цитата: | Если на __QUIT() висяк , тогда этот поток не срабатывает хотя и отсоединен. |
| Вероятно до лампочки пытаться средствами самого приложения его же и убить в случае зависшего __QUIT() , так как он сам по ходу потоки и "убивает" живущие в этом приложении. Убить можно только "извне" (или через hb_threadQuitRequest + Pid приложения) как и советовал Has в личной переписке. Посему можно запустить внешнюю маленькую программу с передачей ей параметра в котором будет жить указатель главного потока приложения , но есть проблема , у него VALTYPE равен "P" , каким образом его передать в качестве параметра скажем в WAPI_ShellExecute а в нем преобразовать параметр из типа "C" в "P" ?
|
|
|
|
| |
Пост N: 191
Зарегистрирован: 21.04.13
|
|
Отправлено: 05.06.16 23:10. Заголовок: TASKLIST + TASKKILL
Получаем список процессов через TASKLIST ( можно в файл), если находим в списке нужный процесс - удаляем также через внешний вызов - TASKKILL TASKLIST имеет фильтры для выделения нужного потока.
|
|
|
Ответов - 67
, стр:
1
2
3
4
All
[только новые]
|
|