1. 程式人生 > >[spark]如何優化資料結構

[spark]如何優化資料結構

導讀(為什麼要優化?):

在spark開發中,如果資料量很大的情況下(億級),即使是基於記憶體的spark也會吃不消,很可能會發生意想不到的一些異常(堆疊溢位、OOM記憶體溢位等),

這時,如何優化使得我們的程式效能更加的好,速度更加的快就是第一任務了,以下是針對資料結構的一些優化解決方案供大家參考

資料結構耗費記憶體情況:

1、每個Java物件,都有一個物件頭,會佔用16個位元組,主要是包括了一些物件的元資訊,比如指向它的類的指標,如果一個物件本身很小,比如就包括了一個int型別的field,那麼它的物件頭實際上比物件自己還要大。

2、java的String物件,會比它內部的原始資料,多出40個位元組,因為它內部使用的char陣列來儲存內部的字元序列,並且還得儲存諸如陣列長度之類的資訊,且String使用的是UTF-16編碼,所以每個字元會佔用2個位元組,比如,包含10個字元的String,會佔用60個位元組。

3、java中的集合型別,比如HashMap和LinkedList,內部使用的是連結串列資料結構,所以對連結串列中的每一個數據,都使用了Entry物件來包裝,Entry物件不光有物件頭,還有指向下一個Entry的指標,通常佔用8個位元組。

4、元素型別為原始資料型別(比如int)的集合,內部通常會使用原始資料型別的包裝型別,比如Integer,來儲存元素.

適用場景:

運算元函式內部的區域性資料,或者是運算元函式外部的資料,均可參考以下資料結構的優化方案。

方案(一)

1.優先使用陣列以及字串,能不用集合類的,就不用集合類(優先使用array,而不是ArrayList、LinkedList、HashMap等集合)

示例:

比如有一個List<Integer> list = new ArrayList<Integer>(),將其替換為int[] arr = new int[]

或者說,對於HashMap、List這種資料,統一用String拼接成特殊格式的字串,比如Map<Integer,Person> person = new HashMap<Integer,Person>()

可以優化為,特殊的字串格式: id:name.address|id:name,address...

作用:

array既比List少了額外資訊的儲存開銷,還能使用原始資料型別(int)來儲存資料,比List中用Integer這種包裝型別儲存資料,要節省記憶體的多

方案(二)

2.應避免使用多層巢狀的物件結構,比如說;public class Teacher{private list<Student> students = new ArrayList<Student>()},這就是一個非常不好的例子,因為Teacher類的內部又嵌套了大量的小student物件

對於上述情況,也可以完全使用特殊的字串來進行資料的儲存,比如,用json字串來儲存資料,就是一個很好的選擇。

示例:

{"teacherld:"1,"teacherName":"leo",students:[{"student":1,"studentName":"tom"}]}

作用:

作用同方案一

方案(三)

3.對於有些能夠避免的場景:

儘量使用int替代String,因為String雖然比ArrayList、HashMap等資料結構高效、佔用記憶體少、但是String還是有額外資訊的消耗,比如之前用String表示id,那麼現在完全可以用數字型別的int,來進行替代(注:id不要用常用的uuid,因為無法轉成int,就用自增型別的int型別的id即可)

相關推薦

Spark優化----資料結構優化

概述: 要減少記憶體的消耗,除了使用高效的序列化類庫以外,還有一個很重要的事情,就是優化資料結構。從而避免Java語法特性中所導致的額外記憶體的開銷,比如基於指標的Java資料結構,以及包裝型別。 有一個關鍵的問題,就是優化什麼資料結構?其實主要就是優化你的運算元函式

Spark優化(九):優化資料結構

優化資料結構 Java中,有三種類型比較耗費記憶體:   物件,每個Java物件都有物件頭、引用等額外的資訊,因此比較佔用記憶體空間。 字串,每個字串內部都有一個字元陣列以及長度等額外資訊。 集合型別,比如HashMap、LinkedList等,因為

Spark效能優化優化資料結構

如何優化資料結構? 1、優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是ArrayList、LinkedList、HashMap等集合。 比如,有個List list = new

[spark]如何優化資料結構

導讀(為什麼要優化?): 在spark開發中,如果資料量很大的情況下(億級),即使是基於記憶體的spark也會吃不消,很可能會發生意想不到的一些異常(堆疊溢位、OOM記憶體溢位等), 這時,如何優化使得我們的程式效能更加的好,速度更加的快就是第一任務了,以下是針對資料

spark學習筆記(3)spark核心資料結構RDD

一個簡單的例子 /* SimpleApp.scala */ import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.Spar

資料結構 筆記:單鏈表的遍歷與優化

如何遍歷單鏈表中的每一個數據元素? 為單鏈表提供新的方法,線上性時間內完成遍歷 設計思路(遊標) -在單鏈表的內部定義一個遊標(Node* m_current) -遍歷開始前將遊標指向位置為0的資料元素 -獲取遊標指向的資料元素 -通過結點中的next指標移動遊標 提供一

資料結構與演算法之美專欄學習筆記-排序優化

選擇合適的排序演算法 回顧   選擇排序演算法的原則 1)線性排序時間複雜度很低但使用場景特殊,如果要寫一個通用排序函式,不能選擇線性排序。 2)為了兼顧任意規模資料的排序,一般會首選時間複雜度為O(nlogn)的排序演算法來實現排序函式。 3)同為O(nlogn)的快排和歸併排序相比,

資料結構與算法系列12--排序優化

如何選擇合適的排序演算法?** 這裡有前面講過的各種演算法是時間複雜度的對比圖,大家可以看看下。 如果我們要選擇一個通用的排序演算法,前面講到的線性排序演算法顯然是不合適的,因為它的適用場景非常有限,儘管他是速度最快的。 如果對於小規模資料可以選擇時間複雜度O(n^2的演算法),但是對

java資料結構初學(記錄)單鏈表交換兩節點(3)可與之前寫的進行對比(程式碼優化)——如果後續徹底搞明白後將精煉此部分內容,刪除部分內容

public void swap(String number1, String number2){                  // 定義節點         StudentNode t1,t2,t3,t4;         /**          *        

資料結構和演算法 | 氣泡排序演算法原理及實現和優化

氣泡排序(Bubble Sort)是排序演算法裡面比較簡單的一個排序。它重複地走訪要排序的數列,一次比較兩個資料元素,如果順序不對則進行交換,並一直重複這樣的走訪操作,直到沒有要交換的資料元素為止。 氣泡排序的原理 為了更深入地理解氣泡排序的操作步驟,我們現在

資料結構和演算法 | 插入排序演算法原理及實現和優化

插入排序演算法是所有排序方法中最簡單的一種演算法,其主要的實現思想是將資料按照一定的順序一個一個的插入到有序的表中,最終得到的序列就是已經排序好的資料。 直接插入排序是插入排序演算法中的一種,採用的方法是:在新增新的記錄時,使用順序查詢的方式找到其要插入的位置,

資料結構和演算法 | 歸併排序演算法原理及實現和優化

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。 歸併排序的原理 歸

資料結構(十一)並查集的實現和優化

並查集 1. 陣列儲存的基礎實現 此時並查集用一個結構體儲存,data 存值(下標+1),parent 存父結點下標 查詢操作中先線性查詢到需要找到的值,再迴圈查詢其根結點 並操作先找到兩合併陣列的樹根,如果不相等,把一棵樹掛到另一棵樹根下 #include&l

C資料結構-優化連結串列與鏈隊

優化連結串列與鏈隊 筆者上一個版本的連結串列,在尾部插入或刪除的操作時,需要使用for迴圈挪動到尾部,這樣時間複雜度就位O(n)。再用其來實現鏈隊的話,那麼鏈隊的入隊和出隊的時間複雜度也會因此受限。如果在連結串列中加入一個指標,指向尾部元素。那麼這個問題就可以迎刃而解。下面是優化過後的

C資料結構-優化順序佇列

優化順序佇列 如果直接複用之前的順序表,那麼在佇列的入隊和出隊操作裡,勢必會有一個操作的時間複雜度是O(n),因為發生了陣列元素的挪移操作。下面是優化後的順序佇列,其中使用了一個頭位置和一個尾位置來迴圈的使用陣列空間,以達到入隊和出隊的時間複雜度都是O(1)。

[筆記遷移][Spark開發語言][Scala][4]資料結構——Map與Tuple

一、 Map 建立Map(key -> value) (1) 不可變Map(預設伴生物件) (2) 可變Map (3) 另一種建立方式 (4) 空HashMap 獲取指定key

Spark效能調優---fastutil優化資料格式

Spark中應用fastutil的場景: 1、如果運算元函式使用了外部變數;那麼第一,你可以使用Broadcast廣播變數優化;第二,可以使用Kryo序列化類庫,提升序列化效能和效率;第三,如果外部變數是某種比較大的集合,那麼可以考慮使用fastutil改寫外部變數,首先從源頭上就減少記憶體的佔

Machine Learning On Spark——第一節:基礎資料結構(一)

作者:周志湖 微訊號:zhouzhihubyond 本節主要內容 本地向量和矩陣 帶類標籤的特徵向量(Labeled point) 分散式矩陣 1. 本地向量和矩陣 本地向量(Local Vector)儲存在單臺機器上,索引採用0開始的整型表示

資料Spark優化讀取Hbase--region 提高並行數過程詳細解析

一. Hbase 的 region 我們先簡單介紹下 Hbase 的 架構和 region : 從物理叢集的角度看,Hbase 叢集中,由一個 Hmaster 管理多個 HRegionServer,其中每個 HRegionServer 都對應一臺物理機器,一臺 HRegionServer

批量資料結構緩衝載入資料二叉樹查詢的效率優化測試

問題:2009年12月10日,在開發客戶維繫挽留系統時,進行Bi_Subscrb_Cdr基礎資料表抽取初步測試時,發現效率奇低。原因有以下可能:1.資料庫主機忙,導致上載資料到記憶體中時,速度過慢。2.網路繁忙(網速確實很慢),由於當時是前臺互動執行程式,但是這個應該影響不大。3.程式所在主機忙,這個可能性