Apache Ignite 中的简单 SELECT(*) 查询非常慢

Simple SELECT(*) queries very slow in Apache Ignite

我正在制作用于新产品的 Apache Ignite 原型。我需要在内存中存储一​​个非常宽的矩阵并访问各种随机行和列。该矩阵有 50,000 列和可能的数百万行。矩阵基本上是只读的,所以我们不用担心写入速度。

我们永远不需要对结果进行排序。客户端应用程序将通过主键和可能的某些列请求特定行,偶尔请求整行。

我将数据加载到 Apache Ignite 中 SQL table,如下所示:

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

我还为 'name' 列编制了索引

CREATE INDEX name_index ON myMatrix(name)

但是,当我尝试简单地 select 一行时,需要 10 多秒才能 return 结果。我们需要更快的响应时间 - 客户希望在不到一秒的时间内完成一组行(可能是数百或数千)和列(最多所有列)。

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)

为什么这么慢?我希望将整个 table 保存在内存中会得到更快的结果。是否只是 table 的宽度导致了问题?

数据库在 r4.8xlarge 实例上 运行,具有 32 个内核和 244GB 内存。

这不完全是一个答案,但我看到了你之前的问题,现在我看到你正在使用 pandas。如果你只是腌制你的矩阵(NumPy/pandas Array,我想)并将它作为 ByteArrayObject 放入 Ignite 缓存中,然后在使用前将其解腌制到 pandas.Array 怎么办?它能解决您的一般问题吗?

这里有一点评论,如果可以的话。 ByteArrayObject 在当前版本中速度很慢,但我已经进行了改进,并且正在等待下一个版本中包含修复程序。如果您需要打包,请写信给我。

还有 Apache Ignite Users 邮件列表。您可以在那里订阅和讨论您的任务。

我试过 运行 一个与你的非常相似的例子,结果证明 Ignite 的 SQL 解析器(基于 H2 SQL 解析器)的性能复杂度为响应列。这意味着在 Ignite 的 table 中有 50,000 列是完全不可行的,或者就此而言,任何大于几十列的东西都是不可行的。我将尝试针对 H2 错误跟踪器提出问题。

上一个回答:

Do you have persistence, or is everything in the RAM? I just can't see why it would take so long. Maybe there's some inlining problem - have you tried CREATE INDEX name_index ON myMatrix(name) INLINE_SIZE 25?

I second that having 50,000 columns is not optimal. Better use an array.

基于, if you really can't move away from having thousands of columns, I'd recommend you use the k-v API: https://apacheignite.readme.io/docs/python-thin-client-key-value

话虽如此,不是 在 cache/table 中包含 50,000 列将是更好的解决方案。