SystemML 二进制格式
SystemML binary format
SystemML 附带了一系列 scripts,可生成供各种算法使用的随机输入数据文件。每个脚本接受一个选项 'format' 来确定数据文件应该以 CSV 格式还是二进制格式写入。
我查看了二进制文件,但它们不是我能识别的任何格式。在线的任何地方似乎都没有文档。什么是二进制格式? header 中有哪些字段?对于密集矩阵,数据是否连续打包在文件末尾(IEEE-754 32 位浮点数),或者元数据字段是否在整个文件中间隔开?
本质上,我们的矩阵和帧的二进制格式是 <MatrixIndexes,MatrixBlock>
类型的 hadoop 序列文件(单个文件或部分文件的目录)(MatrixIndexes
是 long-long 对row/column 块索引)和 <LongWritable,FrameBlock>
。因此,类路径中具有 hadoop io 库和 SystemML 的任何人都可以使用这些文件。
详细地说,这种二进制块格式是我们的内部平铺矩阵表示(默认块大小为 1K x 1K 条目,因此固定的逻辑但可能可变的物理大小)。提供给 SystemML 的任何外部格式,例如 csv 或矩阵市场,都会自动转换为二进制块格式,并且所有操作都在这些二进制中间体上进行。但是,根据后端的不同,有不同的表示形式:
- 对于单节点、in-memory 操作和存储,整个矩阵表示为反序列化形式的单个块(我们使用线性化双数组表示密集,使用 MCSR、CSR 或 COO 表示稀疏)。
- 对于 spark 操作和存储,矩阵表示为
JavaPairRDD<MatrixIndexes, MatrixBlock>
,我们使用 MEMORY_AND_DISK
(反序列化)作为聚合内存中的默认存储级别。
- 对于mapreduce操作和存储,矩阵实际上被持久化到序列文件(类似于inputs/outputs)。
此外,以序列化形式(写入序列文件或在随机播放期间),矩阵块被编码为以下之一:(1)空(header:int rows, int cols, byte type
),( 2) 密集(header 加上序列化双精度值),(3) 稀疏(header 每行加上:每行 nnz,后跟列索引,值对),(4) ultra-sparse(header 加上 row/column 索引和值的三元组,或向量的行索引和值对)。请注意,我们还通过 writeExternal(ObjectOutput os)
和 readExternal(ObjectInput is)
将 java 序列化重定向到相同的序列化代码路径。
有更多详细信息,特别是关于最近添加的压缩矩阵块和帧块 - 所以如果您对此处的任何特定内容感兴趣,请询问。
SystemML 附带了一系列 scripts,可生成供各种算法使用的随机输入数据文件。每个脚本接受一个选项 'format' 来确定数据文件应该以 CSV 格式还是二进制格式写入。
我查看了二进制文件,但它们不是我能识别的任何格式。在线的任何地方似乎都没有文档。什么是二进制格式? header 中有哪些字段?对于密集矩阵,数据是否连续打包在文件末尾(IEEE-754 32 位浮点数),或者元数据字段是否在整个文件中间隔开?
本质上,我们的矩阵和帧的二进制格式是 <MatrixIndexes,MatrixBlock>
类型的 hadoop 序列文件(单个文件或部分文件的目录)(MatrixIndexes
是 long-long 对row/column 块索引)和 <LongWritable,FrameBlock>
。因此,类路径中具有 hadoop io 库和 SystemML 的任何人都可以使用这些文件。
详细地说,这种二进制块格式是我们的内部平铺矩阵表示(默认块大小为 1K x 1K 条目,因此固定的逻辑但可能可变的物理大小)。提供给 SystemML 的任何外部格式,例如 csv 或矩阵市场,都会自动转换为二进制块格式,并且所有操作都在这些二进制中间体上进行。但是,根据后端的不同,有不同的表示形式:
- 对于单节点、in-memory 操作和存储,整个矩阵表示为反序列化形式的单个块(我们使用线性化双数组表示密集,使用 MCSR、CSR 或 COO 表示稀疏)。
- 对于 spark 操作和存储,矩阵表示为
JavaPairRDD<MatrixIndexes, MatrixBlock>
,我们使用MEMORY_AND_DISK
(反序列化)作为聚合内存中的默认存储级别。 - 对于mapreduce操作和存储,矩阵实际上被持久化到序列文件(类似于inputs/outputs)。
此外,以序列化形式(写入序列文件或在随机播放期间),矩阵块被编码为以下之一:(1)空(header:int rows, int cols, byte type
),( 2) 密集(header 加上序列化双精度值),(3) 稀疏(header 每行加上:每行 nnz,后跟列索引,值对),(4) ultra-sparse(header 加上 row/column 索引和值的三元组,或向量的行索引和值对)。请注意,我们还通过 writeExternal(ObjectOutput os)
和 readExternal(ObjectInput is)
将 java 序列化重定向到相同的序列化代码路径。
有更多详细信息,特别是关于最近添加的压缩矩阵块和帧块 - 所以如果您对此处的任何特定内容感兴趣,请询问。