Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Добрый день всем!

Для нового проекта решил освоить FB. Вопросы настройки сервера решились быстро (debian8), код пишу на чистом С в аналогичной среде на debian. Пакеты содержащие все необходимое (на тему ibase.h и libfbclient.so) проинсталил.


Простите.. по парюсь со следующем: где взять исходники с примерами на голом СИ? Не знаю кому как, но мне как-то легче воспринимается. А гугление на вскидку, выдает все что угодно только не эти экзэмплы.
10 июн 20, 11:55    [22148634]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
pietro_888,

в корневой папке Firebird examples/api/
10 июн 20, 12:07    [22148653]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Роюсь вот в примерах.. Не прошу решить задчу) прошу подскажите с общим курсом.

Был у меня проектик, на чистом С. Мне так надо. Люблю этот язык, и кодить на нем люблю.. и быстродействие фантастическое.
В том проекте я слепил взаимодействие с MySQL. Вот что мне нравилось, так это простота несмотря на "низкоуровневость".

Сначала делаю SELECT, потом:
res = mysql_store_result(mysql);
numrows = mysql_num_rows(res);
numfields = mysql_num_fields(res);

И уже все понятно: сколько строк.. полей, и мне СЛАВА БОГУ ничего явно не требовалось указывать, выделять память вручную.
Разворачивай себе.. пока не упрешься в конец цикла по numrows или numfields, а память выделяется автоматом сколько надо при выполнении запроса.

Ну типа:
printf("%s" , sqlrow[n]); - и всего делов, грубо говоря. Ну, по задаче..

В Firebird мы полезли ради раздаваемых по клиентским приложениям сигналам по установке триггеров.
Моя часть на том же С. Т.к - быстродействие, сооружаем hi-load.

То что я туплю пока.. это абсолютно точно. Несколько дней потуплю еще. Но подскажите прямо - это я туплю, или написание С-кода на API напоминает сборку на ассемблере?? Я уже в паре мест нашел требование вручную указать размер массива, т.е его надо сначала спросить у базы, т.к я не знаю заранее и знать не хочу) размерность таблицы. Ну точнее хочу, но абсолютно не хочу переписывать в 100 местах потом код при модификации самой таблицы..

Ну или.. опять таки я возможно туплю но в найденном экземпле присутствует предварительное выделение памяти под данные, напр.
sqlda->sqlvar[2].sqldata = (char *) phone_ext;
и потом еще вручную нуль-терминировать конец строки:
phone_ext[sqlda->sqlvar[2].sqllen] = '\0';

Т.е прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку "среднего уровня" .
11 июн 20, 13:13    [22149331]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

pietro_888
опять таки я возможно туплю но в найденном экземпле присутствует предварительное выделение
памяти под данные, напр.
sqlda->sqlvar[2].sqldata = (char *) phone_ext;
и потом еще вручную нуль-терминировать конец строки:
phone_ext[sqlda->sqlvar[2].sqllen] = '\0';

ISC API и его примеры рассчитаны на то, что программа знает какие поля в базе. Поэтому
если у тебя в базе поле "PHONE_EXT CHAR(10)", ты в программе просто объявляешь "char
phone_ext[10];" и не паришься ни с каким терминированием. После этого вызов
isc_dsql_fetch() автоматически заполняет твои переменные данными и ты работаешь с этими
переменными, не тратя времени на дополнительные обращения к API для получения собственно
данных.

PS: MySQL API тоже так умеет, просто не каждый дочитает до нужного места.

Posted via ActualForum NNTP Server 1.5

11 июн 20, 13:34    [22149341]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Так!

Вас понял. Вот из того же экземпла:

while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)

//тут куча printf по этой строке

isc_dsql_fetch - извлекает одну строку. Так ведь? Вероятно так же как аналогичные *fetch* в MySQL.

Ранее я делаю
sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(3)); - в рассчете допустим, что я точно знаю что хочу получить 3 поля.

Но вот чего я не могу знать в общем случае в принципе, так это сколько будет строк.
Более того, 2 последовательных одинаковых SELECTa могут вернуть разное количкство строк, т.к HI LOAD. (реально у меня 2-15 транзакций в секунду).

В каком месте во всей этой системе запросов происходит выделение фактического объема памяти под результат запроса?
Допустим 818 строк. или 1000.
В момент isc_dsql_execute ?
11 июн 20, 14:03    [22149361]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

pietro_888
прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку
"среднего уровня" .

Хочешь - сооружай. Не хочешь - не сооружай. Раз у тебя "хайлоад" - придётся принять во
внимание какой процент быстродействия твоя прослойка сожрёт во имя "не знаю заранее и
знать не хочу".

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:03    [22149362]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

pietro_888
В каком месте во всей этой системе запросов происходит выделение фактического объема
памяти под результат запроса?
Допустим 818 строк. или 1000.

Результат получается и обрабатывается построчно. Нормальные люди не выделяют память под
весь result set именно потому, что он может быть и 100500 записей, что сожрёт всё ОЗУ и
обрушит программу с ООМ.

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:06    [22149365]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
pietro_888,

в качестве примеров можно посмотреть еще исходники IBX и FIBPlus. Они на pascal, но будет понятно.
Из C - IBPP, и что-то там еще. Посмотрел у себя на сайте - там какое-то старье, надо бы подновить информацию...
11 июн 20, 14:10    [22149369]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

kdv
в качестве примеров можно посмотреть еще исходники IBX и FIBPlus.

Это если только в качестве примеров "как делать не нужно, хоть и можно".

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:18    [22149374]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
>>во имя "не знаю заранее и знать не хочу".
Согласен с Вами, это несколько эмоционально написал.

>>Нормальные люди не выделяют память под весь result set
А я думал.. под это надо представлять с каким ОЗУ имеешь дело и использовать если что опцию LIMIT в запросе.
Конечно ПО тестируется на реальном железе.

>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
11 июн 20, 14:32    [22149385]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

pietro_888
Т.е при каждом isc_dsql_fetch запрос к базе?

Получил запись - сделал с ней что хотел - выкинул - пошёл за следующей.

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:35    [22149390]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
pietro_888
>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
Один раз выделяется буфер под одну запись, а потом в этот буфер делаем последовательные фетчи.

После обработки всех записей буфер освобождается
11 июн 20, 14:36    [22149391]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Дошло, понял.
У меня С-код будет либо на одной машине с FB крутится либо если на разных то соединяться прямым гигабитным проводом.
Так что вопросы траффика не стоит..

Далее. SELECT в данных примерах делается в обертке транзакции.
Результат атомарен пока я не закрою транзакцию?

Получается, память так-таки выделяется, но на сервере??

Товарищи спасибо за дружественность, с вашей помошью кое что для начала понял, для старта.
11 июн 20, 14:45    [22149394]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
pietro_888
Так что вопросы траффика не стоит..
Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
pietro_888
Получается, память так-таки выделяется, но на сервере??
Подозреваю, что только для указателей на конкретные записи
11 июн 20, 14:50    [22149398]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
>>Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
Да ХЗ если честно.. привык мыслить в таком контексте. Надо отправить в аппарат 1000 идентов - извлек 1000 и пулеметной очередью выпустил по сети. А действительно нефиг в память копировать.
11 июн 20, 14:54    [22149400]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
pietro_888
Получается, память так-таки выделяется, но на сервере??

- на сервере - зависит от запроса (метода доступа, которым он выполняется).
- дальше сервер отправляет клиенту пакеты по сети. Обычно - сколько записей влезет в пакет, столько и влезет.
- клиентская часть получает записи этими же пакетами. И на каждый fetch из API прикидывается, что получает запись с сервера, а на самом деле достает очередную из пакета. Пакет кончился - принимает следующий пакет, и т.д.

Бывают запросы, когда в пакете по 1 записи. Но это специфика.

На клиенте складывать записи в буфер или не складывать - зависит от задачи. Если обработка построчная, можно не складывать. Если надо по выборке елозить туда-сюда (например, показывать клиенту), значит надо буферизировать.
как-то так.
11 июн 20, 15:52    [22149439]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Tonal
Member

Откуда: Новосибирск
Сообщений: 187
C mysql есть 2 режима работы курсора.
Первый - драйвер вычитывает весть резалтсет на клиента, распределяя под это память самостоятельно, а потом отдаёт по стольку записей, сколько запросил, но уже с клиента.
И Второй - когда результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.

Естественно есть большие отличия что и как именно хранится на сервере у мускула и птички в этом режиме.
Но с точки зрения клиента грубо можно рассматривать примерно так.
12 июн 20, 17:42    [22149905]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

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

Версионные движки уже появились, но от наследия уже не избавиться.

Posted via ActualForum NNTP Server 1.5

12 июн 20, 17:53    [22149910]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
Tonal
результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.
Конечно нет.
12 июн 20, 18:00    [22149911]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
Tonal
Вот именно по второму режиму и работает птичка.

что за фантазии...
драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы.
Как там конкретный .net драйвер написан - это его личное дело.
"Птичка" к драйверу вообще никаким боком, в данном случае.
13 июн 20, 03:17    [22150054]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
kdv
Tonal
Вот именно по второму режиму и работает птичка.

что за фантазии...
драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы.
Как там конкретный .net драйвер написан - это его личное дело.
"Птичка" к драйверу вообще никаким боком, в данном случае.


Не знаю, что за "брифкейз", но речь шла (я так понял) о том, что клиент (isc api fbclient) заставляет за каждой записью делать отдельный запрос на сервер, и нет возможности сделать запрос "Сервер, верни мне сразу 100 записей резалтсета (или сколько есть) одним пакетом!"
14 июн 20, 22:08    [22150596]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

Не дело API лезть в низкоуровневый обмен клиента и сервера. Программа должна просто
спрашивать "дай мне следующую запись" (или "дай мне Х записей"), а что при этом происходит
между клиентом и сервером это их интимное дело.

Posted via ActualForum NNTP Server 1.5

14 июн 20, 22:14    [22150603]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Dimitry Sibiryakov
что при этом происходит
между клиентом и сервером это их интимное дело.
Это, конечно, красиво выглядит и удобно.
Но управлять размерами буфферов, т.е. памятью, иногда очень полезно и наверху.
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера стащить все тысячи и тысячи записей для отчёта, чем делать тысячи фетчей (которые вызовут хз сколько сетевых запросов).
На медленной сети это особенно важно. Через спутник, например.
14 июн 20, 22:24    [22150611]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
YuRock
Бывает гораздо лучше выделить десяток мегабайт
Программист часто способен заранее довольно точно предсказать размер резалтсета и в записях и в байтах.
Клиент же - нифига. Он не знает, сколько записей может быть.
14 июн 20, 22:27    [22150614]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
YuRock
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера

слишком много вас таких, желающий вытащить "десяток мегабайт". Никакой памяти не напасёшся.
А потом, например, при SORT создается временный файл, который ОС пытается разместить в памяти полностью.
А ты его затем утаскиваешь.
Впрочем, заканчивается это всё точно так же - приходит 10-20 таких клиентов, каждому подай отчет 2-5 гиг, в результате память кончается, и всё это тащится на клиента с диска. А потом жалуются.
14 июн 20, 22:36    [22150620]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock,

ничего, что клиент сам себе один любимый, а у сервера их таких х\з сколько в данный момент ?
14 июн 20, 22:42    [22150628]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
kdv
YuRock
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера

слишком много вас таких, желающий вытащить "десяток мегабайт". Никакой памяти не напасёшся.
А потом, например, при SORT создается временный файл, который ОС пытается разместить в памяти полностью.
А ты его затем утаскиваешь.
Впрочем, заканчивается это всё точно так же - приходит 10-20 таких клиентов, каждому подай отчет 2-5 гиг, в результате память кончается, и всё это тащится на клиента с диска. А потом жалуются.
И к чему это? Сортировка должна быть произведена полностью в любом случае - все я записи профетчил или нет.
Даже если бы это было не так - не вижу смысла делать многомегабайтные запросы и потом, не фетча записи, закрывать запрос. Это странные клиенты. Хотя всякая логика бывает, конечно.
14 июн 20, 22:46    [22150632]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
YuRock,

ничего, что клиент сам себе один любимый, а у сервера их таких х\з сколько в данный момент ?
Не вижу, как это усложняет задачу кроме возможности запроса
"верни следующую запись"
добавить возможность запроса
"верни следующие N записей или сколько осталось, если их меньше N".

Или ты на память намекаешь? Если да - то это полностью на совести прикладных программистов будет, ясное дело.
Они могут как существенно снизить время получения данных, так и переполнить память сервера, что увеличит это время.
14 июн 20, 22:53    [22150638]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock,

речь о том, что нет универсально хороших решений.
14 июн 20, 23:13    [22150654]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad,

Вот, к примеру, есть отчет, который возвращается запросом, результат которого будет 10000 записей 10Мб.

Это на 100 клиентов - 1Gb всего на буффер для этого. При условии, что все одновременно захотят.

Вот у меня клиент есть ~150 точек, большинство из которых - на спутнике (и ничего другого нет лучшего).
Скорость > 10Мбит, но пинг - 9 секунд.

Получить такой резалтсет в таких условиях можно было бы за 20 секунд. И серверу было бы лучше - отдал сразу всё и забыл.
А сейчас за такую задачу даже браться нет смысла - не дождутся, приходится придумывать другие архитектурные решения.
14 июн 20, 23:14    [22150656]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
YuRock,

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

Сообщение было отредактировано: 14 июн 20, 23:14
14 июн 20, 23:15    [22150658]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
hvlad,

Вот, к примеру, есть отчет, который возвращается запросом, результат которого будет 10000 записей 10Мб.

Это на 100 клиентов - 1Gb всего на буффер для этого. При условии, что все одновременно захотят.
Ты действительно считаешь, что сеть в состоянии мгновенно проглотить 100 пакетов по 10МБ на 100 адресов ?

YuRock
Вот у меня клиент есть ~150 точек, большинство из которых - на спутнике (и ничего другого нет лучшего).
Скорость > 10Мбит, но пинг - 9 секунд.

Получить такой резалтсет в таких условиях можно было бы за 20 секунд. И серверу было бы лучше - отдал сразу всё и забыл.
Ты уверен, что сервер (спутник) не отдавал бы их по-очереди в таких условиях ?

YuRock
А сейчас за такую задачу даже браться нет смысла - не дождутся, приходится придумывать другие архитектурные решения.
Боюсь, ты хочешь и рыбку съесть, и всё остальное - так не бывает :)
14 июн 20, 23:31    [22150662]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
Потому надо давать больше свободы прикладным программистам - они знают (могут знать), как в их случае может быть лучше.
Firebird разрешает в некоторой степени управлять размером сетевого пакета (логического, есс-но)

Сообщение было отредактировано: 14 июн 20, 23:31
14 июн 20, 23:32    [22150663]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

Только смысла в этом никакого. Запрос-то на фетч с сервера отправляется ещё до того, как
клиентский буфер резалтсета опустеет, не так ли?..

Posted via ActualForum NNTP Server 1.5

14 июн 20, 23:36    [22150668]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
Dimitry Sibiryakov,

ну да, как первый байт получили - сразу спрашиваем новый пакет.
Или нет так ? А как ? И как тут влияет размер пакета ?
14 июн 20, 23:41    [22150669]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
Ты действительно считаешь, что сеть в состоянии мгновенно проглотить 100 пакетов по 10МБ на 100 адресов ?
Не мгновенно, конечно, но передать гигабайт по гигабитной сетке можно за реальное, не космически большое время. Речь о считанных секундах.
hvlad
Ты уверен, что сервер (спутник) не отдавал бы их по-очереди в таких условиях ?

Даже если и так - это было бы жизнеспособно.
14 июн 20, 23:55    [22150677]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
YuRock
Потому надо давать больше свободы прикладным программистам - они знают (могут знать), как в их случае может быть лучше.
Firebird разрешает в некоторой степени управлять размером сетевого пакета (логического, есс-но)
Я не в курсе, если это возможно - хорошо, это похоже на решение проблемы долгого пинга.
14 июн 20, 23:59    [22150679]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
hvlad
Ты действительно считаешь, что сеть в состоянии мгновенно проглотить 100 пакетов по 10МБ на 100 адресов ?
Не мгновенно, конечно, но передать гигабайт по гигабитной сетке можно за реальное, не космически большое время.
Так она же не гигабитная ?


YuRock
hvlad
Ты уверен, что сервер (спутник) не отдавал бы их по-очереди в таких условиях ?

Даже если и так - это было бы жизнеспособно.
Первый получит своё через 10 сек, второй - через 20, 10-ый - через 100 и т.д.

Жизнеспособно ?
15 июн 20, 00:04    [22150681]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
hvlad
Firebird разрешает в некоторой степени управлять размером сетевого пакета (логического, есс-но)
Я не в курсе, если это возможно - хорошо, это похоже на решение проблемы долгого пинга.
Я же сказал - в некоторой степени :)
См. TcpRemoteBufferSize

PS Долгий пинг так или иначе себя покажет
15 июн 20, 00:07    [22150682]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
Так она же не гигабитная ?
Почему? На сервере - именно гигабитная.

hvlad
Первый получит своё через 10 сек, второй - через 20, 10-ый - через 100 и т.д.

Жизнеспособно ?
Да, даже так очень жизнеспособно, ибо никогда не бывает, чтобы именно этот отчет бухгалтеры магазинов запустили именно одновременно.
А даже если 10 одновременно - это всего лишь 100 секунд - это реальное время.
Сколько времени займет поочерёдный фетч 10к записей - я даже считать не хочу.
15 июн 20, 00:20    [22150684]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
YuRock
пропущено...
Я не в курсе, если это возможно - хорошо, это похоже на решение проблемы долгого пинга.
Я же сказал - в некоторой степени :)
См. TcpRemoteBufferSize

PS Долгий пинг так или иначе себя покажет
Благодарю, почитал.
Там вроде лимит в 32 кб.
Легко посчитать во мя для моего примера: 10000/32 = 300. 3 тысячи секунд. Это - НЕ жизнеспособно.
Но всё равно спасибо, это может ускорить некоторые кейсы в несколько раз.

Сообщение было отредактировано: 15 июн 20, 00:29
15 июн 20, 00:30    [22150685]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
YuRock
На сервере - именно гигабитная

сервер в вакууме? Ты о чем вообще? Допустим, на сервере сеть гигабитная, а у клиента модем gprs 3g. Дальше что?
15 июн 20, 00:30    [22150686]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
kdv
YuRock
На сервере - именно гигабитная

сервер в вакууме? Ты о чем вообще? Допустим, на сервере сеть гигабитная, а у клиента модем gprs 3g. Дальше что?
Сервер что, со всеми клиентами работает по скорости самого медленного (тонкого) клиента?
15 июн 20, 00:33    [22150687]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Или по очереди? Я не понимаю, на что вы намекаете.

Я понимаю так, грубо говоря: если сервер гигабитный, и у него 10 клиентов 100-мегабитных, то сервер может в секунду посылать по 100 мегабит каждому клиенту, а вот если клиентов 11 - то уже меньше.
Возможно, я заблуждаюсь.
15 июн 20, 00:37    [22150688]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

hvlad
ну да, как первый байт получили - сразу спрашиваем новый пакет.
Или нет так ? А как ? И как тут влияет размер пакета ?

Нууу... Например, можно завести какую-нибудь переменную и при каждом фетче проверять: если
количество сообщений в буфере упало ниже её значения - посылать новый запрос. Главное дать
этой переменной имечко позаковыристее, чтобы никто не догадался к чему она служит.
Например, rrq_reorder_level.

Posted via ActualForum NNTP Server 1.5

15 июн 20, 01:00    [22150691]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
hvlad
ак она же не гигабитная ?
Почему? На сервере - именно гигабитная.
Какая разница ? Скорость передачи данных определяется самым медленным звеном.
Или ты надеешься, что все промежуточные уровни будут буферизовать эти гигабайты ?


YuRock
Сколько времени займет поочерёдный фетч 10к записей - я даже считать не хочу.
Нет никакого поочерёдного фетча. Не читай бред.
15 июн 20, 01:29    [22150694]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
Dimitry Sibiryakov,

иди к Джимми поплачь.

PS rrq_reorder_level - абсолютно нормальное имя. Если читать уметь.
15 июн 20, 01:30    [22150695]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
YuRock
если сервер гигабитный, и у него 10 клиентов 100-мегабитных, то сервер может в секунду посылать по 100 мегабит каждому клиенту
Ты хочешь, чтобы эту секунду сервер никого больше не обслуживал.
Это так не работает. И не будет работать никогда.
15 июн 20, 01:32    [22150697]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
YuRock
если сервер гигабитный, и у него 10 клиентов 100-мегабитных, то сервер может в секунду посылать по 100 мегабит каждому клиенту
Ты хочешь, чтобы эту секунду сервер никого больше не обслуживал.
Это так не работает. И не будет работать никогда.
Кого еще, если у него 10 клиентов? Именно их он и должен обслуживать. Ну, еще, может, что-то важное делать с базой, накладные расходы... Я написал: грубо говоря.
15 июн 20, 02:05    [22150702]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
hvlad
Скорость передачи данных определяется самым медленным звеном.
Странно это слышать. Я не знаю особенностей внутренностей сервера, но, странно... Как бы то ни было.

hvlad
Нет никакого поочерёдного фетча. Не читай бред.


Я и не говорю, что на каждую запись отдельный пакет. Но на размер пакета 32кб уже делил - всё-равно ужасно на долгом пинге.
15 июн 20, 02:08    [22150704]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10263
YuRock
Я и не говорю, что на каждую запись отдельный пакет. Но на размер пакета 32кб уже делил - всё-равно ужасно на долгом пинге.
А какой будет ужас, когда размер пакета FB всё равно превысит MTU ...
15 июн 20, 07:42    [22150736]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 18485
Побурчу.
10000 строк - не бывает такого отчёта.
15 июн 20, 09:36    [22150774]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10955
Basil A. Sidorov
А какой будет ужас, когда размер пакета FB всё равно превысит MTU ...
Тут речь о том, чтобы клиент выдал (в идеале) 1 раз op_fetch и потом получил все записи, без повторных запросов. Т.е. не запрос-ответ-запрос-ответ..., а запрос-ответ-ответ-ответ...
15 июн 20, 09:42    [22150780]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1891
Basil A. Sidorov
А какой будет ужас, когда размер пакета FB всё равно превысит MTU ...

скорее когда превысит window size

YuRock
Я и не говорю, что на каждую запись отдельный пакет. Но на размер пакета 32кб уже делил - всё-равно ужасно на долгом пинге.

говоришь, как будто 10мб разом передаются по сети
с таким пингом ничего не спасет, ты не сможешь утилизировать весь канал в одном соединении
15 июн 20, 09:44    [22150781]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
YuRock,

кто тебе мешает написать промежуточное звено которое так делает? Писать толстый клиент, который работает через спутник с огромнейшим пингом, мне кажется немного странным архитектурным решением.
15 июн 20, 09:48    [22150787]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Симонов Денис
YuRock,

кто тебе мешает написать промежуточное звено которое так делает? Писать толстый клиент, который работает через спутник с огромнейшим пингом, мне кажется немного странным архитектурным решением.
Да ничего не мешает, просто ситуация сужает возможности.
15 июн 20, 10:32    [22150818]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

YuRock
Кого еще, если у него 10 клиентов? Именно их он и должен обслуживать

Один клиент запросил миллион записей. Сервер забил весь канал фетчем этому клиенту.
Остальные нервно курят, ожидая пока это дерьмо пролезет сквозь трубу.

Posted via ActualForum NNTP Server 1.5

15 июн 20, 12:32    [22150887]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Dimitry Sibiryakov
YuRock
Кого еще, если у него 10 клиентов? Именно их он и должен обслуживать

Один клиент запросил миллион записей. Сервер забил весь канал фетчем этому клиенту.
Остальные нервно курят, ожидая пока это дерьмо пролезет сквозь трубу.
Я не понимаю, почему должно быть так, если толщина канала сервера в десятки-сотни раз толще, чем у этого клиента, запросившего миллион записей.
Возможно, это особенность сервера Firebird, я нюансов не знаю, но верится неохотно.
15 июн 20, 14:02    [22150974]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

YuRock
толщина канала сервера в десятки-сотни раз толще, чем у этого клиента

1. Откуда у сервера такой канал?
2. Это дерьмо будет накапливаться в месте где широкий канал становится узким.

Posted via ActualForum NNTP Server 1.5

15 июн 20, 14:14    [22150986]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Dimitry Sibiryakov
Это дерьмо будет накапливаться в месте где широкий канал становится узким.
Будет накапливаться, пока не заполнится полностью, и серверу придется ждать, пока можно будет отправить очередную порцию дерьма.
Ну и что? Почему в это время нельзя обслуживать других клиентов?
15 июн 20, 14:26    [22150998]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

YuRock
Почему в это время нельзя обслуживать других клиентов?

Потому что обработка переполнения системного буфера при send() в общем случае нетривиальна
и требует довольно хитровывернутого кода, который 30 лет назад никто просто не стал писать.

Posted via ActualForum NNTP Server 1.5

15 июн 20, 14:38    [22151008]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Dimitry Sibiryakov
YuRock
Почему в это время нельзя обслуживать других клиентов?

Потому что обработка переполнения системного буфера при send() в общем случае нетривиальна
и требует довольно хитровывернутого кода, который 30 лет назад никто просто не стал писать.
Я не видел исходников. Но если без хитровывернутости, то в моём понимании это так:
1. Делаем select.
2. Если он вернул < 0, или FD_ISSET(exceptfds) - ошибка, всё.
3. Если 0, или !FD_ISSET(writefds) - ждём.
4. Иначе - send следующей порции.

Мне кажется, при таком тривиальном алгоритме можно обслуживать других клиентов.
15 июн 20, 14:56    [22151032]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

Вот это "ждём" и "можно обслуживать" - взаимно несовместимы.

Posted via ActualForum NNTP Server 1.5

15 июн 20, 15:08    [22151055]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4214
Dimitry Sibiryakov
Вот это "ждём" и "можно обслуживать" - взаимно несовместимы.
Разве буффер отправки общий на весь сервер? Не на каждый клиентский сокет?
Это тоже мне кажется странным, впрочем я не претендую на звание гуру работы с сетями.
15 июн 20, 15:18    [22151065]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6621
pietro_888,

pietro_888
Простите.. по парюсь со следующем: где взять исходники с примерами на голом СИ?


посмотрите, например:

firebird/examples/api
  • api1.c
  • api3.c
  • ... и остальные тоже


хотя, в принципе, первым же ответом оффлайн-версию той же папки подсказали

Сообщение было отредактировано: 15 июн 20, 15:59
15 июн 20, 15:58    [22151092]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Firebird, InterBase Ответить