了解nzMatrix

nzMatrix分层架构

nzMatrix采用分层架构,包括带有应用程序接口的 NZPLSQL 层和未作为应用程序接口公开的 C++ 层。 C++ 层通过调用英特尔 MKL 库(包括 PBLAS 和ScaLAPACK例程)来执行许多功能。 PBLAS 和ScaLAPACK是经过验证的高度可扩展的分布式矩阵例程库,依靠 BLACS 和 MPI 进行进程间通信。 有关 UDAP 的更多信息,请参阅《用户自定义分析流程开发人员指南》

矩阵存储和访问

Netezza矩阵引擎使用以NZ_MAT_ 开头的标准Netezza数据库表在当前连接的数据库中存储数据。作为最佳实践,应设置权限隐藏这些表,防止标准用户直接访问。 标准Netezza Analytics权限授予脚本create_inza_db.shcreate_inza_db_user.sh用于修改权限。 虽然提升权限后可以直接访问nzMatrix表,但不建议这样做,因为直接访问可能导致代码与未来版本的nzMatrix不兼容或数据损坏。

create_inza_db_user.sh脚本会授予用户执行在 NZM 数据库中注册的nzMatrix存储过程所需的权限。 建议您为连接目的创建其他数据库,而不是使用 NZM 数据库。

nzMatrixNZPLSQL 存储过程允许与矩阵交互。 nzMatrix 提供了用于从用户可访问的 数据库表格中创建矩阵并将矩阵保存为行/列/值格式的例程。 Netezza nzMatrix还提供了用于列出和删除数据库中存储的矩阵以及创建身份矩阵、随机矩阵等的例程。

当某个数据库是共享的,矩阵命名空间也是共享的。 因此,如果在连接到共享数据库时创建了一个度量,那么任何拥有在共享数据库中工作的适当权限的用户都可以访问该矩阵。 这与默认情况下用户对其他用户的表没有可见性的表不同。 请注意,如果不删除之前创建的矩阵,就无法在共享数据库中创建同名的新矩阵。

nzMatrix的一般限制

nzMatrix使用 64 位双精度浮点近似数值数据类型来存储和计算矩阵元素值。 行和列索引以 32 位整数值存储,最多可存储 2,147,483,647 行和列。 行和列索引从 1 开始;不允许索引值为零。

nzMatrix计算会自动分布到Netezza设备上。 使用 PBLAS 和ScaLAPACK的计算会自动以先进先出方式排队,每次运行一个。 如果正在执行使用 PBLAS 或ScaLAPACK的计算步骤,则其他用户尝试执行相同步骤的操作将被排在队列中。

要检查哪些任务已排队(如果有),请使用以下 SQL 命令:
CAll NZA..SP_MPI_STATS():
要中止任务,请使用以下 SQL 命令,并根据需要替换工作任务 ID:
CALL NZM..KILL_ENGINE(<job_task_ID>);

使用 PBLAS 或ScaLAPACK进行计算时,需要消耗 S-Blade RAM 来临时保存输入矩阵、中间工作矩阵和结果矩阵。 每个矩阵元素消耗 8 个字节。 超过可用内存可能会导致计算中止,并出现 "内存不足 "的用户错误。 可用内存等于总内存减去Linux操作系统、Netezza软件和不相关的并发查询所需的内存。

例如,一个拥有 12 个 S-Blade 和每个 S-Blade 16 GB 内存的IBM Netezza 1000-12,在执行两个 65,000 x 65,000 元素矩阵的矩阵乘法运算时,需要消耗其可用的内存和大约 1 小时的时间。 对一个 45,000 x 45,000 元素矩阵进行奇异值分解也会消耗可用的 RAM,大约需要 7 个小时。 这些是最大限制,并假定并发查询次数最少。

可伸缩性

随着矩阵维数的增加,内存需求和计算时间也迅速增长。 容纳nn列的矩阵所需的内存量与n的平方成正比,而对此类矩阵进行乘法、反转或分解所需的运算次数约与n的立方成正比。

随机数字生成器

Netezza Analytics为英特尔数学内核库随机数生成器 (RNG) 提供了一套封装程序。 SQL API 提供了一套存储过程,可生成充满从给定概率分布中抽取的伪随机值的矩阵。 有关每个存储过程的说明,请参阅《NetezzaMatrix 引擎参考指南》。 有关 RNG 的更多信息,请参见英特尔数学内核库矢量统计库说明

批量算法

从第 3 版开始,IBM Netezza Analytics提供了批量算法,可用于并行处理许多较小的矩阵。

批量算法有
  • 批量矩阵操作
  • 批量线性回归
  • 批量主成分分析(PCA)

有关批量算法的详细信息,请参阅《IBM Netezza数据库内分析开发人员指南