0

SystemML 附带一系列脚本,这些脚本生成随机输入数据文件,供各种算法使用。每个脚本都接受一个选项“格式”,该选项确定数据文件应该以 CSV 格式还是二进制格式写入。

我查看了二进制文件,但它们不是我认识的任何格式。网上的任何地方似乎都没有文档。什么是二进制格式?标题中有哪些字段?对于密集矩阵,数据是否连续打包在文件末尾(IEEE-754 32 位浮点数),还是在整个文件中间隔有元数据字段?

4

1 回答 1

1

本质上,我们的矩阵和帧的二进制格式是 hadoop 序列文件(单个文件或部分文件的目录)类型<MatrixIndexes,MatrixBlock>MatrixIndexes对于行/列块索引是长长对)和<LongWritable,FrameBlock>,分别。所以任何在类路径中有 hadoop io 库和 SystemML 的人都可以使用这些文件。

详细地说,这种二进制块格式是我们内部的平铺矩阵表示(默认块大小为 1K x 1K 条目,因此是固定的逻辑但可能是可变的物理大小)。提供给 SystemML 的任何外部格式,例如 csv 或矩阵市场,都会自动转换为二进制块格式,并且所有操作都在这些二进制中间体上工作。但是,根据后端,有不同的表示形式:

  • 对于单节点、内存中操作和存储,整个矩阵以反序列化形式表示为单个块(我们使用线性化双数组表示密集,使用 MCSR、CSR 或 COO 表示稀疏)。
  • 对于 spark 操作和存储,矩阵表示为JavaPairRDD<MatrixIndexes, MatrixBlock>,我们使用MEMORY_AND_DISK(反序列化)作为聚合内存中的默认存储级别。
  • 对于 mapreduce 操作和存储,矩阵实际上是持久化到序列文件中(类似于输入/输出)。

此外,以序列化形式(写入序列文件或在 shuffle 期间),矩阵块被编码为以下之一:(1)空(标题:int rows, int cols, byte type),(2)密集(标题加上序列化的双精度值),(3)稀疏(每行的标题加:每行 nnz,后跟列索引,值对),(4)超稀疏(标题加上行/列索引和值的三元组,或向量的行索引和值对)。请注意,我们还通过writeExternal(ObjectOutput os)和重定向 java 序列化readExternal(ObjectInput is)到相同的序列化代码路径。

还有更多细节,特别是关于最近添加的压缩矩阵块和帧块 - 所以请询问您是否对这里的任何特定内容感兴趣。

于 2016-10-07T05:20:56.360 回答