多路陣列聚集(Multiway)

2021-07-03 04:02:18 字數 948 閱讀 2910

多路陣列聚集其實就是對維度(dimension)進行選擇,保留一些常用的可以很方便地生成別的子立方體的立方體(cube)。對乙個維做聚集(aggregation)其實就是按照這個維度的方向做加法,把這個維度的值縮減成乙個。比如3d的按照某一維降成2d,最終降成0d的也就是數多維陣列裡面非零元素的個數了(假設陣列元素是0-1)。

當把多維陣列檔案分割成可以放進記憶體的塊(chuck)時,我們希望盡可能減少需要重新載入塊的操作,也就是減少i/o,盡可能需要這塊的操作都一次完成。也就是每個塊只是被載入一次。這個是很容易做到的,但是不同的塊載入順序在維度聚集的時候會需要不同的快取大小,而各個維度的聚集是同時進行的,所以需要乙個合適的載入塊的順序使得所需要的快取最小。

比如,乙個三維的立方體abc,我們要聚集成ab、ac、bc三個二維的立方體,這三個聚集是同時做的,所以按照什麼樣的順序載入chuck會影響到這三個聚集中間資料要儲存時間的長短,進而影響所需要的快取到小(因為需要儲存中間結果越多,所需快取越大)。

如果a、b、c的基數分別是40,400,4000,每個維度分4段,一段構成乙個chuck的邊。那麼chuck取的順序應該是按照基數由小到大的維度,也就是先a後b再c。

原因是先a維,那麼bc可以按照最小的面積(100×1000)在bc方向的面做聚集。

而後b維,那麼ac就要按照整個a軸乘以c的一塊(40×1000),因為至少當第4塊取完。第5塊開始取的時候,才能拋棄開始更新第一塊的值,所以在第一塊的值能夠被更新以前,所有的中間結果都要保留。

最後c維,那麼ab就要按照整個ab面做聚集(40×400)。原因是第一塊,的值要等到第17塊載入的時候才能被更新,所以在這之前計算的中間值都要被儲存。

總結來說,就是看到第x塊被載入的時候,第1塊被更新(因為這塊的載入),那麼從1到(x-1)塊在當前不需要做聚集的維度上的「超面積」(也就是各個維的基數乘起來)就是所需要的快取數。另外一種說法,就是1到(x-1)塊的側面積之和(不需要聚集的維度上)。

出處:

方體計算的多路陣列聚集方法

步驟 1 將陣列分成塊 chunk,乙個可以裝入記憶體的小子方 2 壓縮的稀疏陣列定址 chunk id,offset 3 通過訪問立方體單元,計算聚集。可以優化訪問單元組的次序,使得每個單元被訪問的次數最小化,從而減少記憶體訪問和磁碟i o的開銷。哪個是多路陣列聚集的最佳遍歷次序?方法 各平面要按...

完全立方體計算的多路陣列聚集 MultiWay

看資料探勘書的時候,遇到該演算法,鬱悶了好幾天終於搞明白了,現在分享一下自己的理解。這裡只解釋一下3 d陣列中2 d陣列的計算,3 d陣列的圖可以參照 資料探勘概念與技術 韓家煒 中的資料立方體中的圖。多路陣列聚集演算法,該演算法的思想是 也算是最後的結論 將最小的平面放在記憶體中,對最大的平面每次...

swift學習之路 陣列

學習參考位址 1 建立及初始化陣列 var shoppinglist water book food println shoppinglist 1 shoppinglist 2 food from china println shoppinglist 這是最初級的建立陣列,並且通過下標key訪問陣列...