Apache Ignite插入速度非常慢

时间:2019-06-26 18:10:43

标签: python sql ignite in-memory-database key-value-store

我正在尝试将大型矩阵加载到在AWS中运行的Apache Ignite主节点中。 EC2实例具有128GB的内存和512GB的磁盘空间。

矩阵是具有50,000列和15,000行的CSV。

加载非常缓慢-前150批插入在一起,需要30多分钟才能工作。我正在使用Python Thin Client

import pandas as pd
import pyignite
from pyignite import Client

client = Client()

client.connect('127.0.0.1', 10800)
print('deleting records...')
client.sql('DELETE FROM full_test_table')
df = pd.read_csv('exon.csv')

col = list(df)
col = col[1:]

names = ', '.join('"' + item + '"' for item in col)
names = 'name, ' + names
#print(names)

for index, row in df.iterrows():
    print('inserting for {0}'.format(str(row[0])))
    row[0] = '\"{0}\"'.format(row[0])

    row[0] = str(index)

    values = ', '.join(str(item) for item in row)
    sql = 'INSERT INTO full_test_table ({0}) VALUES({1})'.format(names, values)
    client.sql(sql)

我想用Python加载数据,因为我比Java更熟悉。这对我来说似乎太慢了-甚至PostgreSQL也可以在几秒钟内完成这些插入操作。有什么问题吗?

我也尝试了CSV中的COPY命令-似乎没有更快的速度。

2 个答案:

答案 0 :(得分:0)

我刚刚从Java尝试过,并且从JDBC中可以看到每秒大约25次插入。这不是一个非常高的数字,但是比您显示的30分钟要好得多。也许这是Python客户端的事情。

答案 1 :(得分:0)

从Ignite 2.7开始,Python瘦客户端以及其他瘦客户端将服务器节点之一用作代理-通常是在连接字符串中设置的一个。代理从客户端接收所有请求,并在需要时将它们定向到其余服务器。同样,代理将结果集发送回客户端。因此,代理可能是您的情况以及整个网络吞吐量的瓶颈。检查代理服务器是否没有过度使用CPU,并且没有任何issues related to garbage collection or memory utilization。 Ignite 2.8将不再需要该代理。

无论如何,在Ignite中预加载数据的最快方法是使用IgniteStreaming API。这些还不适用于Python,但是Java应用程序非常简单。通过将记录与键值API一起放入流式传输,您可以使用this example作为参考。

如果您想继续使用SQL INSERTS,请同时使用JDBC或ODBC驱动程序以及SET STREAMING命令。