SystemML二进制格式

时间:2016-10-05 00:07:21

标签: systemml

SystemML附带了一系列scripts,可生成随机输入数据文件,供各种算法使用。每个脚本都接受一个选项'format',用于确定数据文件是以CSV还是二进制格式写入。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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