Простые запросы SELECT (*) очень медленные в Apache Ignite - PullRequest
0 голосов
/ 25 июня 2019

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

Нам не нужно заказывать результаты. Клиентское приложение будет запрашивать определенные строки по первичному ключу и, возможно, по определенным столбцам, а иногда и по всем строкам.

Я загрузил данные в Apache Ignite в таблицу SQL, которая выглядит следующим образом:

CREATE TABLE myMatrix
name CHAR(20) PRIMARY KEY,
col1 INT,
col2 INT,
col3 INT,
...
col50000 INT

Я также проиндексировал столбец 'name'

CREATE INDEX name_index ON myMatrix(name)

Однако, когда я пытаюсь просто выбрать одну строку, для возврата результата требуется более 10 секунд. Нам нужно гораздо более быстрое время отклика - клиент будет ожидать набор строк (может быть, сотни или тысячи) и столбцов (до всех столбцов) менее чем за секунду.

import pandas as pd
import pyignite
from pyignite import Client
import time

client = Client()

client.connect('127.0.0.1', 10800)

now = time.time()
result = client.sql('SELECT * FROM full_test_table WHERE      name=\'F1S4_160106_058_G01\'')
print('Got Result in')
print(time.time() - now)

Почему это так мучительно медленно? Я надеялся, что хранение всей таблицы в памяти даст более быстрые результаты. Это только ширина таблицы, которая вызывает проблемы?

База данных работает на большом экземпляре r4.8x, с 32 ядрами и 244 ГБ памяти.

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Я попытался запустить пример, очень похожий на ваш, и оказалось, что синтаксический анализатор SQL Ignite (основанный на синтаксическом анализаторе H2 SQL) имеет квадратичную производительность по числу столбцов ответов. Это означает, что абсолютно невозможно иметь 50000 столбцов в таблице в Ignite или что-то большее, чем несколько десятков в этом отношении. Я попытаюсь подать проблему с системой отслеживания ошибок H2.

Предыдущий ответ:

У вас есть постоянство или все в оперативке? Я просто не понимаю, почему это займет так много времени. Может быть, есть какая-то проблема с встраиванием - вы пробовали CREATE INDEX name_index ON myMatrix(name) INLINE_SIZE 25?

Во-вторых, наличие 50 000 столбцов не является оптимальным. Лучше использовать массив.

0 голосов
/ 28 июня 2019

Основываясь на анализе @ alamar , если вы действительно не можете отказаться от тысяч столбцов, я бы порекомендовал вам использовать kv API: https://apacheignite.readme.io/docs/python-thin-client-key-value

Сказавчто не с 50000 столбцами в кэше / таблице будет лучшим решением.

0 голосов
/ 26 июня 2019

Это не совсем ответ, но я видел ваш предыдущий вопрос, и теперь я вижу, что вы используете панд.Что, если вы просто выберете матрицу (NumPy / pandas Array, я полагаю) и поместите ее в кэш Ignite как ByteArrayObject, а затем перед использованием выберете pandas.Array?Это решит ваш вопрос в целом?

Вот небольшое замечание, если это так.ByteArrayObject очень медленный в текущем выпуске, но я уже внес улучшения, и исправления ожидают включения в следующие версии.Напишите мне, если они вам нужны.

Существует также Apache Ignite Users список рассылки.Вы можете подписаться и обсудить свою задачу там.

...