Форум » Для флейма » MiniGui + PostgreSQL » Ответить

MiniGui + PostgreSQL

Andrey: Кому будет интересно. https://habrahabr.ru/post/282764/

Ответов - 126, стр: 1 2 3 4 5 6 7 All

PSP: Andrey пишет: Сделал тест для МиниГуи + PostgreSQL, копирование dbf-файла 13000 записей за 3 мин. Тормоза однако. Но это копирование записей в лоб: одна за другой. Искал варианты ускорения процесса. Андрюха, SQL никак не ускорит копирование файла. Это же ж Structured Query Language таки...)))

Andrey: PSP пишет: Андрюха, SQL никак не ускорит копирование файла. Это же ж Structured Query Language таки...))) Смотри Пост N: 5017 и читай по ссылке.

Andrey: Петр пишет: Почитайте README.md из поставки harbour Не ту у меня такого файла... Давно не обновлялся с CVS.

Петр: Andrey пишет: Давно не обновлялся с CVS Ну тогда открою великую тайну: harbour уже на git перешел..

PSP: Andrey пишет: Смотри Пост N: 5017 и читай по ссылке. И чё? "...in order to make the insertion of large portions of data into PostgreSQL faster..." Одна простая вещь: физическая среда передачи данных. Всё остальное вторично. Если эта самая large portions of data пролазит через физику с трудом, то никакой SQL тут не поможет. Пойми это. ps. nPreBuffer: автор подразумевает размер 1400 байт, чтобы был ниже стандартного MTU=1500 байт. Но, 1500 байт бывает только в случае соединения IPoE или в локальной сети. Все другие типы соединений имеют свой MTU. Это значит, что фрагментация пакетов будет в любом случае. Она там и пишет: "needs testing how libPQ is doing buffering by itself, and if this is needed?"

Andrey: Петр пишет: Ну тогда открою великую тайну: harbour уже на git перешел.. Спасибо ! Отстал я от жизни... Но там тоже нет доки https://github.com/harbour/core/tree/master/contrib/hbpgsql Понял, про какую доку... https://github.com/harbour/core/blob/master/README.md

Dima: вернул тему на место

Andrey: Разобрался со скоростью загрузки в базу для PostgeSql. Конвертор Dbf -> PostgeSql на MiniGui заработал ! База 18 Мб, 14 тыс.записей за 40 секунд всего - отправка ОДНИМ запросом. То что надо. LetoDb так же примерно качает, может чуть быстрей, только за 15-20 транзакций. Раньше было примерно 4 минуты. Читал что в PostgeSql можно одним запросом отправлять 1Gb. Пока ещё не проверял...

Dima: Andrey И в чем дело было ?

PSP: Andrey пишет: Читал что в PostgeSql можно одним запросом отправлять 1Gb. Пока ещё не проверял... К примеру, есть два канала: один - 10Миб/с, а второй 100Мбит/с. Как думаешь, одинаковое время будет затрачено на передачу пакета данных размером в 1Gb в обоих случаях? Может не стоит озвучивать цифры, зависящие от массы других факторов? Если на передачу тех же твоих 14тыс. записей через хреновый канал сотового оператора понадобится час, ты скажешь, что PostgeSQL - это отстой? Прости уж за сарказм)) LetoDb так же примерно качает, может чуть быстрей, только за 15-20 транзакций. Это только подтверждает, что всё упирается в физику.

Andrey: PSP пишет: Это только подтверждает, что всё упирается в физику. Да я не спорю с этим. Просто долго ковырялся с простым решением у себя в тестовом примере, пока не догадался как сделать. Dima пишет: Andrey И в чем дело было ? Делал как раньше на LetoDb - отправка по одной записи. Потом сделал (SergKis помог, без него бы не получилось!) отправку через транзакции. В PostgreSql сделал отправку всей базы ОДНОЙ транзакцией. Просто привыкнуть надо к Sql, работа с DBF это просто. Хотя дай поработать кто не работал с DBF, то для него будет много непоняток.

PSP: Andrey пишет: Да я не спорю с этим. Просто долго ковырялся с простым решением у себя в тестовом примере, пока не догадался как сделать. Ок, я тоже перегибаю)

Andrey: Хотелось бы иметь отдельный модуль postgres_aadd.c Чтобы не зависить от разработчиков contrib_hbpgsql, когда они ещё это сделают. В свой проект я добавил модуль: postgres_aadd.c ---------------- файл postgres_aadd.c ------------------ /* * Добавочный файл к postgres.c * Для определения версии libpq */ #include "hbapierr.h" #include "hbapiitm.h" HB_FUNC( PQLIBVERSION ) { //#if PG_VERSION_NUM >= 90100 hb_retni( PQlibVersion() ); //#else // hb_retni( 0 ); //#endif } ---------------- конец файла postgres_aadd.c --------------- Закоментировал строчки, т.к. всегда возвращается 0 Но потом не идёт компиляция моего проекта, ошибка: postgres_aadd.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_PQlibVersion' referenced from .... hbmk2[dbf_to_PostgreSQL]: Error: Running linker. 2 Нашел в исходниках функцию: int PQlibVersion(void) { return PG_VERSION_NUM; } Помогите пожалуйста кто может - как подсоединить эту функцию ?

PSP: PG_VERSION_NUM поищи для начала.

Andrey: PSP пишет: PG_VERSION_NUM поищи для начала. Не нашёл... Где хоть искаь то ?

Pasha: Andrey пишет: Помогите пожалуйста кто может - как подсоединить эту функцию ? Наверное надо подключить файлы в начале модуля: #include "libpq-fe.h" #include "pg_config.h" А еще лучше #include "hbpgsql.h" в которм находятся соответствующий определения А саму функцию лучше написать так: #include "hbapi.h" #include "hbpgsql.h" HB_FUNC( PQLIBVERSION ) { hb_retni( PG_VERSION_NUM ); }

Петр: Pasha пишет: А саму функцию лучше написать так: Если Андрею дать грабли - он рано или поздно на них наступит.

Andrey: Петр пишет: Если Андрею дать грабли - он рано или поздно на них наступит. Не надо мне давать. Я и сам их найду ! Pasha пишет: А саму функцию лучше написать так: Спасибо ! Получилось. Только фигня получается. Эта функция возвращает 80408, т.е. номер библиотеки libpq.lib А мне надо было версию libpq.dll лежащий рядом с ехе-ником, через которую обращаюсь с сервером PostgreSql.

Петр: Andrey пишет: Только фигня получается. Не думал. что все получится так быстро (в смысле - грабли) А ну попробуйте это «[pre2]/* * IT IS IMPORTANT: in my case Postgres ver. 9.5.3 for Windows systems * was installed on local machine, port 5432 (default) */ #include "hbdyn.ch" PROCEDURE Main() LOCAL hLib LOCAL nVersion := 0 LOCAL cConnInfo LOCAL host := "localhost" LOCAL hostaddr := "127.0.0.1" LOCAL port := 5432 LOCAL connect_timeout := 10 ? PQlibVersion() ? hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) //? hb_DynCall( { "PQlibVersion", "libpq_8.dll", HB_DYN_CTYPE_INT } ) hLib := hb_libLoad ( "libpq.dll" ) IF ! Empty( hLib ) nVersion := hb_DynCall( { "PQlibVersion", hLib, HB_DYN_CTYPE_INT } ) IF nVersion < 90100 ? "The function PQping() not supported." QUIT ENDIF // 1) !!databases!! is not valid word for ConnInfo cConnInfo := "host = localhost database = test" PingTest( cConnInfo, hLib ) // 2) the default port for Postgres is 5432, but we can try connect to port 3333 and see what is happen cConnInfo := "host = " + host + " port = " + "3333" PingTest( cConnInfo, hLib ) // 3) next attempt cConnInfo := hb_strFormat( "host = %1$s hostaddr = %2$s port = %3$d connect_timeout = %4$d", host, hostaddr, port, connect_timeout ) PingTest( cConnInfo, hLib ) hb_libFree( hLib ) ENDIF RETURN /*--- * */ STATIC PROCEDURE PingTest( c, hLib ) ? 'cConnInfo is "' + c + '"' ? "PQPing( cConnInfo ) returns ", GetPingResult( hb_DynCall( { "PQping", hLib, HB_DYN_CTYPE_INT }, c ) ) RETURN /*--- * */ STATIC FUNCTION GetPingResult( n ) LOCAL aMsg := ; { ; { "PQPING_OK", "(server is accepting connections)"}, ; { "PQPING_REJECT", "(server is alive but rejecting connections)"}, ; { "PQPING_NO_RESPONSE", "(could not establish connection)"}, ; { "PQPING_NO_ATTEMPT", "(connection not attempted (bad params))"} ; } IF n >= 0 .AND. n < Len( aMsg ) RETURN ( aMsg[ n + 1 ][ 1 ] + " " + aMsg[ n + 1 ][ 2 ] ) ENDIF RETURN "" #pragma BEGINDUMP #include "hbpgsql.h" HB_FUNC( PQLIBVERSION ) { hb_retni( PG_VERSION_NUM ); } #pragma ENDDUMP[/pre2]»

Andrey: Петр пишет: А ну попробуйте это Немного модифицировал под МиниГуи. Вот результат: 80408 90407 90407 cConnInfo is "host = localhost database = test" PQPing( cConnInfo ) returns PQPING_NO_ATTEMPT (connection not attempted (bad params)) cConnInfo is "host = localhost port = 3333" PQPing( cConnInfo ) returns PQPING_NO_RESPONSE (could not establish connection) cConnInfo is "host = localhost hostaddr = 127.0.0.1 port = 5432 connect_timeout = 10" PQPing( cConnInfo ) returns PQPING_NO_RESPONSE (could not establish connection) Я так понял, что для определения версии libpq.dll достаточно всего этой строчки (и и новой функции): ? hb_DynCall( { "PQlibVersion", "libpq.dll", HB_DYN_CTYPE_INT } ) ? А выгружать/убить после этой функции hb_DynCall() - не надо ? А то не пользовался такой функцией.



полная версия страницы