我是原型apache ignite用于新产品的使用。我需要在内存中存储一个非常宽的矩阵,并访问各种随机行和列。该矩阵有50,000列,可能是数百万行。矩阵本质上是只读的,因此我们不必担心写速度。
我们永远不需要订购结果。客户端应用程序将通过主键以及某些列请求特定行,有时是整个行。
我将数据加载到Apache IGNITE中,该表看起来像这样:
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个内核和244GB的内存。
我尝试运行与您非常相似的示例,事实证明,Ignite的SQL Parser(基于H2 SQL Parser(具有响应列数的二次性能compexity。这意味着在IGNITE的表中有50,000列是完全不可行的,或者在此方面大于几十个。我将尝试针对H2 Bug Tracker提出问题。
上一个答案:
您是否持久,还是RAM中的所有内容?我只是看不到为什么要花这么长时间。也许有一些内部问题 - 您是否尝试过
CREATE INDEX name_index ON myMatrix(name) INLINE_SIZE 25
?i第二,拥有50,000列不是最佳的。最好使用数组。
这并不是一个答案,但是我看到了您以前的问题,现在我看到您正在使用Pandas。如果您只是腌制矩阵(我想是numpy/pandas Array
(,然后将其放入IGNITE CACE作为ByteArrayObject
,然后在使用前将其取消到pandas.Array
?它一般会解决您的问题吗?
如果可以的话,这里有一点说明。ByteArrayObject
在当前版本中非常慢,但是我已经进行了改进,并且正在等待将其包含在下一个版本中。给我写信,如果您需要包装它们。
还有Apache IGNITE用户邮件列表。您可以在此处订阅并讨论您的任务。
基于 @alamar的分析,如果您真的无法摆脱数千列,我建议您使用K-V API:https://apacheignite.readme.io.io/docs/python-thin-client-key-key-value
这样说,不是在缓存/表中有50,000列将是一个更好的解决方案。