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