Я создаю прототип Apache Ignite для использования в новом продукте. Мне нужно хранить в памяти очень широкую матрицу и получать доступ к различным случайным строкам и столбцам. Матрица имеет 50 000 столбцов и потенциально миллионы строк. По сути, матрица будет доступна только для чтения, поэтому нас не волнует скорость записи.
Нам не нужно никогда заказывать результаты. Клиентское приложение будет запрашивать определенные строки по первичному ключу и, возможно, по определенным столбцам, а иногда и по всей строке (строкам).
Я загрузил данные в Apache Ignite в таблицу SQL, которая выглядит так:
CREATE TABLE myMatrix
name CHAR(20) PRIMARY KEY,
col1 INT,
col2 INT,
col3 INT,
...
col50000 INT
Я также проиндексировал столбец "имя"
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.8xlarge с 32 ядрами и 244 ГБ памяти.