Что может быть причиной этой ошибки «неверный хост» в запросе kdb? - PullRequest
0 голосов
/ 08 мая 2018

Я получаю странную ошибку при попытке запросить слишком много дат из хронологической базы данных, разбитой на даты:

q)eod: h"select from eod where date within 2018.01.01 2018.04.22"
'/tablepath/2018.04.04/eod/somecolumn: invalid host
q)eod: h"select from eod where date within 2018.01.17 2018.04.20"
'/tablepath/2018.04.20/eod/othercolumn: invalid host
q)eod: h"select from eod where date within 2018.01.18 2018.04.20"
q)

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

q)(-22!eod) % 1024 * 1024
646.9043
q)count eod
2872546

мы находим, что он не особенно велик ни по объему памяти, ни по количеству строк.

Поиск в поиске ошибок "недопустимого хоста", по-видимому, не приводит к чему-либо значимому, и я не вижу ничего в документации по kdb об ограничениях размера, которые были бы актуальны. У кого-нибудь есть идеи?

Edit:

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

q)jj: select from eod where date within 2018.01.01 2018.04.22
Too many compressed files open
k){0!(?).@[x;0;p1[;y;z]]}
'./2018.04.04/eod/settlecab: No such file or directory
.
?
(+`exch`date`class..
q.Q))

Обратите внимание, что файл ./2018.04.04/eod/settlecab действительно существует и содержит данные: У меня нет проблем с загрузкой данных только за дату, указанную в ошибке, и упомянутый столбец имеет значимые значения:

q)jj: select from eod where date=2018.04.04
q)select count i by settlecab from jj
settlecab| x    
---------| -----
0        | 41573
1        | 2269

Ключевым моментом представляется сообщение Too many compressed files open, но что я могу с этим поделать?

Изменить для сводки / решения:

В рассматриваемой таблице было много столбцов, все они сохранены в сжатом формате. Когда вы отправляете запрос по слишком большому количеству дат одновременно, kdb будет пытаться отобразить все эти столбцы одновременно, ограничиваясь тем, сколько сжатых файлов может быть открыто одновременно.

Как только я понял проблему, было доступно несколько решений:

  1. Я мог бы извлечь только некоторые столбцы из базы данных, уменьшив количество файлов, которые kdb должен был держать открытыми,
  2. Я мог бы заставить kdb вытянуть все данные в память, добавив в запрос фиктивное предложение where, например (null column) | not null column (хак, но он работает),
  3. Я мог бы обновить версию kdb и снять ограничения ОС (в моем случае это не практично).

Я до сих пор не понимаю, почему это привело к ошибке invalid host при удаленном запросе к базе данных.

1 Ответ

0 голосов
/ 08 мая 2018

Прежде всего, мы можем просто уточнить структуру базы данных, с которой вы работаете. Из файловых путей, возвращаемых в ваших ошибках, видно, что у вас есть база данных с разделением по датам. Вы имели в виду несегментированную базу данных, когда в исходном запросе сказали, что она не секционирована?

С точки зрения исправления вашей проблемы, вы пытались загрузить базу данных в сеанс и выполнить эти запросы напрямую? Если это так, вы получаете те же проблемы?

Если это работает нормально, проблема может заключаться в том, как вы определяете дескриптор базы данных. Как определяется h в вашем исходном примере?

Возможно, стоит попытаться выбрать отдельные даты в вашей базе данных, попытаться изолировать проблему и определить, связана ли она с данными на диске. Попробуйте специально запросить даты, которые упоминаются в ваших ошибках.

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

Дайте нам знать, если вы продолжите с этим.

Иосиф

...