Я бы предложил несколько изменений, когда вы пытаетесь подключиться к удаленному серверу:
- Не запускайте синхронный запрос, поскольку это заставит сервер замедлить его обработку.Попробуйте сделать асинхронный запрос, используя обратные вызовы .
- . Не выполняйте полное сканирование таблицы (для тщательного сравнения) в каждом вызове специально для регулярных выражений.Вполне возможно, что большая часть данных будет доступна в кеше при следующем вызове, но все же это не гарантируется, что опять-таки повлияет на нормальные операции сервера.
- Не выполнять запросы данных в пакете.Либо используйте таймер, либо сделайте другой запрос данных, когда поступят последние данные пакета.
Нижеприведенный подход основан на приведенных выше предложениях.Это позволит избежать сканирования полной таблицы для столбцов, отличных от столбца индекса (что является небольшим весом), и выполнять следующий запрос только при поступлении последней партии.
Создать функцию обработки партии
Эта функция будет запускаться на сервере и считывать небольшой пакет данных из таблицы с использованием индексов и возвращать необходимые данные.
q) batch:{[ind;s] ni:ind+s; d:select from t where i within (ind;ni), sym like "A*";
neg[.z.w](`upd;d;$[ni<count t;ni+1;0]) }
Требуется 2 аргумента - начальный индекс и размер пакета для работы.
Эта функция, наконец, будет вызывать upd
функцию на локальном компьютере Macintosh и передаст 2 аргумента.
- Индекс таблицы для запуска следующей партии (возвращает 0, если все строки выполнены, чтобы остановить обработку следующей партии)
- Данные из текущего запроса партии
Создать функцию обратного вызова
В эту функцию войдет результат от функции пакетной обработки.
Если индекс> 0, это означает, что есть еще данные для обработки, и следует запустить следующую партиюсформировать этот индекс.
q) upd:{[data;ind] t::t,data;if[ind>0;fetch ind]}
Создать основную функцию для запуска процесса
q)fetch:{[ind] h (batch;ind;size)}
Окончательно открыть соединение, создать переменную таблицы и запустить функцию fetch
.
q) h:hopen `:server:port
q) t:()
q) size:100
q) fetch 0
Теперь вышеуказанный метод основан на предположении, что таблица сервера является статической.В случае, если он получает обновления в режиме реального времени, тогда потребуются изменения в зависимости от того, как таблица обновляется на сервере.
Кроме того, могут быть выполнены другие оптимизации в зависимости от атрибутов, установленных на удаленной таблице, что может повысить производительность.