我正在为新产品使用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)
为什么这样这么慢?我希望将整个表保存在内存中会带来更快的结果。只是表格的宽度会引起问题吗?
该数据库在具有32个内核和244GB内存的r4.8xlarge实例上运行。
答案 0 :(得分:1)
我尝试运行一个与您的示例非常相似的示例,结果发现Ignite的SQL解析器(基于H2 SQL解析器)具有响应列数的二次性能兼容。这意味着在Ignite的表中拥有50,000列是完全不可行的。我将尝试针对H2错误跟踪器提出问题。
上一个答案:
您是否有持久性,还是RAM中的所有内容?我只是不明白为什么要花这么长时间。也许存在一些内联问题-您是否尝试过
CREATE INDEX name_index ON myMatrix(name) INLINE_SIZE 25
?第二,拥有50,000列不是最佳选择。最好使用数组。
答案 1 :(得分:0)
这不完全是答案,但是我看到了您以前的问题,现在我看到您正在使用熊猫。如果您只是腌制矩阵(我想应该是NumPy / pandas Array
)并将其作为ByteArrayObject
放在Ignite缓存中,然后在使用前将其解开到pandas.Array
怎么办?它将总体上解决您的问题吗?
如果可以的话,这里有一点评论。 ByteArrayObject
在当前版本中非常慢,但是我已经进行了改进,并且修复程序正等待包含在下一版本中。如果需要将它们打包,请写信给我。
还有Apache Ignite Users邮件列表。您可以在那里订阅并讨论您的任务。
答案 2 :(得分:0)
基于@alamar's analysis,如果您真的无法摆脱成千上万的列,我建议您使用k-v API:https://apacheignite.readme.io/docs/python-thin-client-key-value
已经说过,不在缓存/表中具有50,000列将是一个更好的解决方案。