Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: delover
Дата сообщения: 03.08.2011 15:39
YuriyRR

Цитата:
В FIB есть обработка потери коннекта.

Опять поперёк читаем?
1) Не FIBPlus а FireBird на стандартных IB компонентах.
2) Какая обработка потери коннекта? Вы о чём? !!! Коннекта ещё не было !!! Пытались открыть базу на пустом CD устройстве...
3) Писал уже выше. - Убираю диск нижимаю крестик ни Halt ни Kill Process не работают. Выхожу из сессии виндовс на меню смены пользователя, завершаю сессию, потом захожу снова - в процессах болтается неубитое тело программы.


Цитата:
Причина не в FB а в руках.

Чтобы цитировать известные фразы неплохо бы научится просто читать а не по диагонали.


Цитата:
Кстати люблю хвастаться.

Пытаюсь открыть табличку IB компонентом - оут оф мемори. делаю Unidirectional и сливаю в свой датасет. Количество данных - 52 мегобайт, около 94 тысяч записей. Цепляю датасет к гриду и запускаю программу снова.
Датасет открывается за 00:00:00 сек 875 миллисекунд
Наверно у меня руки кривые учитывая что данные ещё и шифрануты.
Автор: YuriyRR
Дата сообщения: 03.08.2011 15:53

Цитата:
delover

Цитата:
делаю Unidirectional и сливаю в свой датасет

а что за датасет то используешь? не подумай плохого, просто интересно )
Автор: delover
Дата сообщения: 03.08.2011 19:24
YuriyRR

Цитата:
а что за датасет

Ну не датасет, а просто таблица. ) Компонента дадасета свой. Еcли быть точным - у меня массив вариантов (немного ускоренный в области массивов). Называется тип TvTable.

Ненаю чё случилось, похоже антивирус апдейтился или Винда, но больше вообще не зависает и про ошибку не говорит. Больше похоже что ФаерБёрд непричём.
Автор: delover
Дата сообщения: 04.08.2011 07:04
Забыл добавить - может типо этого есть хорошо -

Код:
DM.IBDatabase1.Connected := true;
try
list := NCalc(idgroup, mass);
finally
DM.IBDatabase1.Connected := false;
end;
Автор: YuriyRR
Дата сообщения: 04.08.2011 14:17
delover

Цитата:
Компонента дадасета свой.

Я бы использовал какой нибудь memotable. Писать и так есть что ). К тому же варианты ИМХО очень медленно обрабатываются.
Автор: druff
Дата сообщения: 04.08.2011 14:40
YuriyRR
оффтоп конечно, но датасеты в памяти тоже разные бывают.. мне бы вот хотелось найти приличный датасет для увязки Data-Aware компонентов со списком объектов (экземпляры одного класса). Никто случаем не посоветует хороший вариант?
Автор: X11
Дата сообщения: 04.08.2011 14:56

Цитата:
мне бы вот хотелось найти приличный датасет

Для сервера Firebird О_о ?
Автор: delover
Дата сообщения: 04.08.2011 22:22
YuriyRR

Цитата:
К тому же варианты ИМХО очень медленно

Я бы поостерёгся с таким утверждением. Правда пришлось наваять DynArrayToBinVariant(var V: Variant; const DynArray; Len: Integer) - преобразует динамический массив байтов в исключительно одномерный массив байтов типа вариант. После этого все блобы стали летать. Да и фишка в том, что есть свойство TField.Value - вариант. А вот преобразовывать уже не надо. Да и через датасет я не всегда работаю. Просто забираю данные, тупым присваиванием ссылок на массивы и работаю точно так же с данными типа:

p(var v: tvariantarray);
begin
v['name']:='fio';
v.next;
...
p(mydataset1); p(ibdataset1)

Тут получается что никакой код из модуля DB просто не юзается.
А memotable умеет хранить таблицы в одном файле который расшифровывается когда логин верный?
Автор: YuriyRR
Дата сообщения: 04.08.2011 23:29
delover

Цитата:
А memotable умеет хранить таблицы в одном файле который расшифровывается когда логин верный?

Конечно умеет и в файл можешь писать и в стрим, а в стриме можешь извращаться с ним как заблагорассудится. Я в последнее время склонен к kbmMemTable, но есть и шедевры с поддержкой SQL запросов.
Автор: delover
Дата сообщения: 05.08.2011 14:08
YuriyRR
Пожалуй придётся поискать бесплатные и посмотреть. Может удастся прямо их заточить на массивы вариантов. Просто там сортировки бывают далеко нетривиальные. Да и по скорости заценить... )))
Автор: druff
Дата сообщения: 09.08.2011 18:54
Вопрос: есть ли для птички UDF библиотеки для работы с регулярными выражениями?
Автор: X11
Дата сообщения: 09.08.2011 19:48
Я не встречал, но в птичку 2.5 встроены уже прямо в сервак
Автор: druff
Дата сообщения: 09.08.2011 21:26
X11
да, я видел, но мне встроенного функционала не хватает.. Придётся свои функции написать.
Автор: delover
Дата сообщения: 10.08.2011 09:53
YuriyRR

Цитата:
Я в последнее время склонен к kbmMemTable

Ну с первого взгляда компонент пока мне не сможет заменить мой. Я скачал 2007 версию - там нет Extended филдов. По скорости ещё не сравнивал. А какие ещё можно посмотреть? (сори оффтоп)
Автор: X11
Дата сообщения: 10.08.2011 10:29
Народ, звыняйтэ, но здесь Firebird, а не компоненты для Delphi
Автор: druff
Дата сообщения: 10.08.2011 16:31

но при этом тема датасетов в памяти - интересная! Может продолжим её в другом топике?
Автор: tanaseduard
Дата сообщения: 10.08.2011 16:41
druff
Я бы продолжил. Интересно еще SQL между датасетами памяти и Master-Detailed связки.
Автор: X11
Дата сообщения: 10.08.2011 16:59
Для этого есть Прикладное программирование -> Вопросы по компонентам
http://forum.ru-board.com/topic.cgi?forum=33&topic=8529&start=3520#16

Ну или в прикладном программировании создайте новую тему про наборы данных в памяти
Автор: delover
Дата сообщения: 14.08.2011 12:28
druff
tanaseduard
Тема интересная но я не берусь за её создание. Это касается и FireBird. Интересно потому, что любой SQL сервак можно воспринимать как мощную вычислительную машину + хранилище. Если перекачать из хранилища в клиентский датасет, можно оставить серваку самое интересное -- математику, тем самым сняв очень много нагрузки с базы. Интересно, но упирается всегда всё в то, что ID - айдишники найденные вне базы, на клиенте, бесполезны для сервака. 5000 айдишников это уже 32 кб в запросе... Даже если эти 32кб не меняются на протяжении 3х месяцев, а клиентов 500 и запросов в день от клиента 1000, эти айдишники будут всегда расчитываться и фигурировать в SQL ввиде сложных подселектов для наружного джойна. Это потому что решаем мы "малой кровью".
Автор: druff
Дата сообщения: 14.08.2011 21:22
delover
Про какие ID идёт речь? а то я похоже не в теме..
Автор: delover
Дата сообщения: 15.08.2011 08:30
druff
Например я нахожу словатрь часто встречающихся слов в названиях организаций. Это требуется чтобы исключить их при сравнении. Например ООО, может быть написано английскими буквами русскими буквами маленькими большими и даже цифрой ноль 0. ООО встречается часто и не должно влиять на результат сравнений. Это клиентский словарь.
При этом сравнение должно проводится только для тех организаций по которым идёт работа. Это джойн между справочником организаций и справочником клиентов. Без этого джойна запрос выполняется на сервере 46 секунд. Почему бы не перекачать результат джойна в клиентский датасет, произвести вычисления ООО на клиенте? - Нет просто смысла. Результат джойна 32кб (это айдишники организаций в строку). Хорошо допустим названия я выполнил на клиенте, а телефоны, майлы или другая характеристика сравнения?
Автор: delover
Дата сообщения: 15.08.2011 11:00
Допустим была мысль заранее вычислить на клиенте частотность слов в названиях. И привязать ввиде объектных филдов - стринглистов к клиент-датасету. А нафига такое счастье если запрос валится уже на 400 айдишниках?
Автор: druff
Дата сообщения: 15.08.2011 14:42
delover
46 секунд это что-то очень долго.. Можно пример запроса посмотреть?
Автор: delover
Дата сообщения: 15.08.2011 17:01
druff
Естественно прога не использует запрос который от 46 сек до полторы минуты если нужен left. Но он выглядит примерно так:

Код: select distinct cc.name, c.id, c.name, ...
from clients c
join cards as cc on (cc.cid=c.id)
where not(c.name is null)
Автор: druff
Дата сообщения: 16.08.2011 07:15
delover
Просмотрел всю тему, кажется стало чуть понятнее. Твоя программа выполняет следующие действия (поправь меня, если я не прав):
1) выполняешь запрос в FB с объединением справочника организаций и клиентов
2) для каждой записи из полученной выборки выполняешь какой-то сложный расчёт (извини, но я пока не понял, что именно он делает) на клиенте

У меня такие вопросы возникли: а нельзя результаты этого сложного расчёта тоже хранить в базе? Или регулярно запускать скрипт, который исправит ошибки в названиях организаций (речь ведь об ошибках, если ООО может быть написано нулями?)
Автор: delover
Дата сообщения: 16.08.2011 14:03
druff
Все правильно кроме изменения условий.

Цитата:
Или регулярно запускать скрипт, который исправит ошибки

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

Цитата:
а нельзя результаты этого сложного расчёта тоже хранить в базе?

Надобы, но сиё возможно для уже сформировавшегося и удовлетворяющего по всем параметрам вычисления. Пока моё вычисление лучше чем T9, но близко к телефонной программе T9. Требования нарабатываются.

OOO, я взял для примера. Другой пример:
Магазин Продукты и Магазин Дюймовочка. Слово магазин совпало:
Eq=Магазин ... dA:Продукты ... dB:Дюймовочка
Магазин=4500 раз в справочнике
Продукты=1500 раз в справочнике
Дюймово4ка=4 раза в справочнике.
-
Вывод - непохожы
Оптовый рынок Дюймовочка, тут похожи.

Добавлено:
Суть
Супер цель: Привести базу к условиям уникальности записи об организации.
Цель: Дать инструментарий для этого.
Почему в примере был distinct:
Это отношение многих ко многим. Мои вычисления то же самое многие ко многим. Каждая просматриваемая организация в фоновом режиме сравнивается с каждой организацией являющейся клиентом.
Почему нетактично бороться с ООО:
Аппарат сравнения строк с условием независимости от языка отработан ровно на столько же на сколько AnsiCompareText. Есть и сравнения и преобразования и сортировки. Меняются только названия функций. Ну и зачем бороться с проблеммой которой нет? Наобарот надо поощрять людей.

Добавлено:
В идеале
Мне бы иметь на клиенте этот пресловутый джойн в виде айдишников и записи о положительном результате сравнения тоже в виде айдишников падающих в калкфилд. Плюсы - мало памяти, быстый доступ к результатам, абсолютно прозрачная фоновая работа с расчётами не на серваке. В общем тупо клиентдатасет, который абсолютно безполезен - строки айдишников превышают 2-4кб.
Автор: TuMOXA123
Дата сообщения: 22.08.2011 14:37
Если не в тему, дайте ссылку на хороший форум по firebird.

Есть ли какая-нибудь возможность запустить Firebird 2.5 на FreeBSD как standalone сервер (не через inetd\xinetd) ?
Автор: X11
Дата сообщения: 22.08.2011 14:47
sql.ru
ibase.ru
Автор: AlexPetrovich
Дата сообщения: 22.08.2011 16:09
delover

Цитата:
что ID - айдишники найденные вне базы, на клиенте, бесполезны для сервака. 5000 айдишников это уже 32 кб в запросе...

А если загнать эти айдишники во временную таблицу (GTT) и выполнять джойн с ней ?
Автор: delover
Дата сообщения: 24.08.2011 06:33
1. Делаю селект с IB таблицы, который возвращает OutOfMemory.
2. Делаю унидиректионал и копирую в собственный датасет всю таблицу (таблица 180мб).
3. Утраиваю свои данные в датасете, те добавляю ещё IB два раза.
4. Копирую в MSSQL для прикола.
5. MSSQL фечит всё (3 исходных таблицы) без унидеректинала больше 1 секунды.
6. Мой клиентдатасет разумеется чуть меньше одной секунды.
7. IB без унидиректинала призадумывается, но так же OutOfMemory, не сделав 1 третьей.
8. Прихожу к другу - он сидит за компиком - качает парнуху. Говорю скопируй вот эту, а он мне - ты чё типа лох чтоли - невидишь она 300мб. Я говорю и типа чё? Он- это либо фуфловое качество, либо продолжительность 20 секунд, наф надо.

Ребят это не смешно 180мб - OutOfMemory? А самая дешевейшая память которую ещё возможно купить разве не 512мб?

AlexPetrovich
Пока это единственный вариант который я уже делал. Тогда сервак ещё не поддерживал временные таблицы. Пришлось написать очень сложную математическую машину. Так как я уже говорил - можно организовать клиентдатасет, но...! Придётся организовывать датасет, плюсом организовывать временные выборки для джойнов, то есть заточить ту мат махину которую я бы не хотел использовать.
Я вполне согласен с ограничением самого SQL запроса на 2кб - это заглаза. Но я не отоношу набор цыфр с запятыми в SQL синтаксис. Строка длиной 2мб с цыфрами и запятыми парсится в TIntegerList не больше 20 миллисекунд на друвнем компике.

Добавлено:
ps
Где бы память такую купить чтобы меньше 280мб.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.