Я создаю прототип 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 ГБ памяти.