通过瘦 python 客户端将原始二进制值存储在 Apache Ignite 中

Store raw binary value in Apache Ignite through thin python client

我正在尝试使用瘦 Python 客户端将一些原始二进制数据保存到 Apache Ignite 中,但过程非常缓慢(实际上它看起来取决于数据的大小)。

对于我的简单测试用例,我在本地启动了单节点 Ignite(版本 2.7.0,没有任何特定配置):

$ bin/ignite.sh 

此外,我有一个二进制文件,其中包含我想存储在 Ignite 中的内容。大小约为 6MB。 这是我的源代码:

with open("/var/bin_text.bin", mode='rb') as file:
    file_content = file.read()

client = Client()
client.connect('127.0.0.1', 10800)
my_cache = client.get_or_create_cache('my cache')
my_cache.put("key_bin", file_content)

在 my_cache.put 之后,进程就冻结了。我什至没有等到最后(我已经在 2 分钟后终止了它)。

但是,将文件内容转换为字符串传递速度非常快。

my_cache.put("key_str", str(file_content))

我错过了什么?

更新

我使用@jock-tanner 提出的方法研究了我想放入 Ignite 的数据大小。这是我得到的:

size: 1024, elapsed time: 0.0045130252838134766 secs
size: 2048, elapsed time: 0.007149457931518555 secs
size: 4096, elapsed time: 0.004557132720947266 secs
size: 8192, elapsed time: 0.010631561279296875 secs
size: 16384, elapsed time: 0.025577783584594727 secs
size: 32768, elapsed time: 0.07686495780944824 secs
size: 65536, elapsed time: 0.2685544490814209 secs
size: 131072, elapsed time: 0.8761806488037109 secs
size: 262144, elapsed time: 3.121284246444702 secs
size: 524288, elapsed time: 12.343520879745483 secs
size: 1048576, elapsed time: 53.10914897918701 secs
size: 2097152, elapsed time: 205.68292760849 secs

将2MB的数据放入本地安装的Ignite需要3分钟多的时间。会不会是我的 Ignite 配置问题?

抱歉,您无法像在第一个示例中尝试的那样在 Ignite 中存储二进制数据。如果可能,您应该将其转换为 Unicode 字符串(如您在第二个示例中所做的那样),或者转换为字节序列:

cache1.put('key', [ord(x) for x in file_content], value_hint=ByteArrayObject)

与只是二进制字符串的 Redis 键和值不同,Ignite 键和值实际上是键入的。在 pyignite 中,我努力将这一事实隐藏在鸭子 typing-friendly get/put 语义背后,但它仍在显示。

您可以在以下文档中了解 Ignite 数据类型以及如何使用它们:

请注意,Ignite 类型系统基于 Java 系统,这就是为什么通常没有关于 Ignite 数据类型的文档的原因。

根据从@jock-tanner 收到的信息,这看起来是 Python 瘦客户端上的一个缺陷。创建相应的 JIRA 票证 - https://issues.apache.org/jira/browse/IGNITE-11854.