Я тестирую MonetDB как решение для проекта науки о данных.У меня есть таблица из 21K столбцов - все, кроме трех, это функции, описанные как строки с плавающей запятой (32-битные) и строки 6,5 млн. (Которые могут увеличиваться или не увеличиваться, возможно, до 20 млн. Строк).
Моя цель - использоватьинтегрированный Python на MonetDB для достижения способности тренироваться без экспорта данных из БД каждый раз.Кроме того, запросы по определенным столбцам необходимы, поэтому хранение столбцов может быть существенным преимуществом.Я скомпилировал MonetDB 11.31.13, чтобы получить поддержку встроенного Python.ОС CentOS 7. Хранилище не SSD.48-ядерный сервер с ~ 300 ГБ памяти.Я создал (уникальный) индекс для таблицы (без анализа).
Я заметил, что когда я
SELECT * FROM [TABLE_NAME] SAMPLE 50;
, это занимает много времени.Затем я попытался:
SELECT f1, f2, ..., f501 from [TABLE_NAME] SAMPLE 50;
SELECT f1, f2, ..., f1001 from [TABLE_NAME] SAMPLE 50;
SELECT f1, f2, ..., f2001 from [TABLE_NAME] SAMPLE 50;
...
SELECT * from [TABLE_NAME] SAMPLE 50;
Я выполнял запросы локально с помощью mclient и использовал время для измерения количества времени, которое потребовалось, и заметил две вещи:
Есть период, когда одно ядрозанимает 100% процессора.Чем больше столбцов, тем больше времени требуется для заполнения.Только после его завершения я вижу, как работают все ядра, используются данные и т. Д. Кроме того, в течение этого времени запрос не появляется в результате select * from sys.queue();
В конце концов, время, необходимое для получения 50 строк из таблицыбыло почти 4 часа.
Количество столбцов удваивается, но между каждым этапом теста количество времени, необходимое для получения результата, утраивается.
Итак, мои вопросы: ожидается ли это поведение или оно отражает то, что я сделал неправильно?
Данные, запрашиваемые из таблицы, должны составлять около 4 МБ (50 * 21000 * 4 Байт), поэтому это отражаетзначительное количество времени для ожидания такого небольшого количества данных.
Помощь приветствуется!