SystemML附帶一系列scripts,它們生成供各種算法使用的隨機輸入數據文件。每個腳本都接受一個選項「格式」,用於確定數據文件是否應以CSV或二進制格式寫入。SystemML二進制格式
我已經看過二進制文件,但它們不是我認識的任何格式。在網上沒有任何文件。什麼是二進制格式?標題中有哪些字段?對於密集矩陣,文件末尾是連續打包的數據(IEEE-754 32位浮點數),還是在整個文件中間隔有元數據字段?
SystemML附帶一系列scripts,它們生成供各種算法使用的隨機輸入數據文件。每個腳本都接受一個選項「格式」,用於確定數據文件是否應以CSV或二進制格式寫入。SystemML二進制格式
我已經看過二進制文件,但它們不是我認識的任何格式。在網上沒有任何文件。什麼是二進制格式?標題中有哪些字段?對於密集矩陣,文件末尾是連續打包的數據(IEEE-754 32位浮點數),還是在整個文件中間隔有元數據字段?
本質上,我們的矩陣和框架二進制格式是hadoop的序列文件<MatrixIndexes,MatrixBlock>
型的(單個文件或一部分文件目錄)(與MatrixIndexes
是一個長隆對用於行/列塊索引)和<LongWritable,FrameBlock>
,分別。因此,classpath中的任何具有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序列化重定向到相同的序列化代碼路徑。
還有更多的細節,特別是關於最近添加的壓縮矩陣塊和框架塊 - 所以請詢問你是否有興趣在這裏具體的任何東西。
謝謝!我想直接從Java程序使用SystemML和Hadoop類。我怎樣才能找到SystemML爲什麼生成Java代碼從文件中讀取一個矩陣:'X = read(fileX);' 一般來說,我如何確定DML內置函數和SystemML類之間的映射關係? –
通常,由於各種重寫,不同的後端和多個物理操作符,在腳本級和實際操作之間存在N:M映射。但是,如果您有興趣將其作爲本地(非分佈式)庫使用,那麼您可以使用'MatrixReader reader = MatrixReaderFactory.createMatrixReader(InputInfo.BinaryBlockInputInfo); reader.readMatrixFromHDFS(fname,rlen,clen,brlen,bclen,estnnz);'或單/多線程讀取器直接。這些操作都是在MatrixBlock中定義的(例如,用於一元聚合如sum,rowSums,colSums等的aggregateUnaryOperations)。 – mboehm7
我懷疑我的矩陣不是二進制塊格式,因爲當我嘗試使用您的建議代碼閱讀它時,我得到了'java.io.IOException:二進制塊輸入的並行讀取失敗.'元數據文件(.mtd)包括一行''格式「:」二進制「,'。如何確定爲給定矩陣使用哪個InputInfo實例(SystemML必須有代碼來確定此實例)? –