Я получаю странную ошибку при попытке запросить слишком много дат из хронологической базы данных, разбитой на даты:
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 будет пытаться отобразить все эти столбцы одновременно, ограничиваясь тем, сколько сжатых файлов может быть открыто одновременно.
Как только я понял проблему, было доступно несколько решений:
- Я мог бы извлечь только некоторые столбцы из базы данных, уменьшив количество файлов, которые kdb должен был держать открытыми,
- Я мог бы заставить kdb вытянуть все данные в память, добавив в запрос фиктивное предложение
where
, например (null column) | not null column
(хак, но он работает),
- Я мог бы обновить версию kdb и снять ограничения ОС (в моем случае это не практично).
Я до сих пор не понимаю, почему это привело к ошибке invalid host
при удаленном запросе к базе данных.