1. 程式人生 > >Spark優化----資料結構的優化

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

概述:
    要減少記憶體的消耗,除了使用高效的序列化類庫以外,還有一個很重要的事情,就是優化資料結構。從而避免Java語法特性中所導致的額外記憶體的開銷,比如基於指標的Java資料結構,以及包裝型別。
有一個關鍵的問題,就是優化什麼資料結構?其實主要就是優化你的運算元函式,內部使用到的區域性資料,或者是運算元函式外部的資料。都可以進行資料結構的優化。優化之後,都會減少其對記憶體的消耗和佔用。
如何優化資料結構?
       1、優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是ArrayList、LinkedList、HashMap等集合。
           比如,有個List<Integer> list = new ArrayList<Integer>(),將其替換為int[] arr = new int[]。這樣的話,array既比List少了額外資訊的儲存開銷,還能使用原始資料型別(int)來儲存資料,比List中用Integer這種包裝型別儲存資料,要節省記憶體的多。
還比如,通常企業級應用中的做法是,對於HashMap、List這種資料,統一用String拼接成特殊格式的字串,比如Map<Integer, Person> persons = new HashMap<Integer, Person>()。可以優化為,特殊的字串格式:id:name,address|id:name,address...。
       2、避免使用多層巢狀的物件結構。比如說,
            public class Teacher { 
                   private List<Student> students = new ArrayList<Student>() 
            }
        就是非常不好的例子。因為Teacher類的內部又嵌套了大量的小Student物件,對於上述例子,也完全可以使用特殊的字串來進行資料的儲存,比如用json字串來儲存資料,就是一個很好的選擇。
        {"teacherId": 1, "teacherName": "leo", students:[{"studentId": 1, "studentName": "tom"},{"studentId":2, "studentName":"marry"}]}
       3、對於有些能夠避免的場景,儘量使用int替代String。因為String雖然比ArrayList、HashMap等資料結構高效多了,佔用記憶體量少多了,但是之前分析過,還是有額外資訊的消耗。比如之前用String表示id,那麼現在完全可以用數字型別的int,來進行替代。
這裡提醒,在spark應用中,id就不要用常用的uuid了,因為無法轉成int,就用自增的int型別的id即可。