【问题标题】:Storing large matrices in Apache Ignite在 Apache Ignite 中存储大型矩阵
【发布时间】:2019-11-04 09:37:55
【问题描述】:

我有一个大的整数矩阵,我希望能够对其进行切片和运行分析。我正在使用 Apache Ignite 对此进行原型设计。

矩阵为 50000 列 x 500 万行。我希望能够在这个矩阵上运行以下操作:

  1. 获取单个列的所有数据
  2. 获取一些随机的行和列子集的所有数据。
  3. 计算一行与其他行的相关系数。

我现在正在尝试满足 1. 和 2.,但我不知道如何存储矩阵。我正在考虑像这样存储矩阵:

row1 {
    co1: val
    co2: val
    co3: val
    ...
    co50000: val
}
row2{ ... }

但我不确定我是否可以在 Ignite 中拥有像这样的复杂数据类型,或者我是否只能拥有一个键:值对。文档不清楚。当我尝试使用 pyignite 插入字典时(我的 Java 有点生疏,所以我现在坚持使用 python),数据以数组形式返回:

>>> test.put('row2', { "col1": 50, "col2":0 })
>>> test.get('cell2')
['gene1', 'gene2']

我是 Apache Ignite 的新手,但文档似乎没有详细说明如何执行此操作,或者它是否会表现出色。

【问题讨论】:

  • 因为它是一个整数矩阵,我可能会使用整数作为键和整数数组作为值,因为它会占用更少的内存。请注意,默认情况下,Ignite 将数据存储为一个字节数组,并且每次访问它时都会反序列化值。为避免反序列化,您可以使用堆上缓存模式apacheignite.readme.io/docs/…。从您提供的代码 sn-p 不清楚您想要实现什么以及出了什么问题。
  • 我需要能够在列中指定某些值 - 我需要请求 row1、row50、row600 以及 col1、col50000 和 col6。在这种情况下存储整个数组是行不通的,对吧?

标签: matrix key-value ignite


【解决方案1】:

我认为您需要存储 500 万个 KV 对,使用行作为键并包含 50000 列数组作为值。

最好坚持原始类型。不确定如何最好地将其映射到 Python。

【讨论】:

  • 我需要能够在列中指定某些值 - 我需要请求 row1、row50、row600 以及 col1、col50000 和 col6。在那种情况下存储整个数组是行不通的,对吧?
  • 为什么,获取整行,获取您需要的列。
  • 如果数据存储在数组中,如何指定列?
  • cache.get(row)[column]?
  • 我是 ignite 新手,但如果它是一个数组,并且列名是随机字符串,我认为我们不能以这种方式访问​​数组。 cache.get(row)['foo'] 不起作用。
【解决方案2】:

从瘦客户端的角度来看,Ignite 缓存是扁平的,而不是嵌套的。您可以将数组、序列、字典或上述任意组合作为值放入 Ignite 缓存中,但之后不能在缓存中遍历值。您只能检索整个值并查看它。

cache.get(row)[column] 可以工作,但它会从缓存中检索整行 50000 个元素作为 Python 列表,然后寻址此列表中的单个元素。我认为在你的情况下这将是次优的。

如果我的问题没有错,面向 JSON 的数据库(如 MongoDB 或 PostgreSQL 的 JSONB)具有您描述的功能。不过不知道它们是否足够快用于数据分析。

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 2018-07-04
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多