Spark效能優化:優化資料結構

豐澤發表於2018-09-13

如何優化資料結構?

1、優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是ArrayList、LinkedList、HashMap等集合。

比如,有個List list = new ArrayList(),將其替換為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"}]}
複製程式碼
例如mapreduce程式:
context.write(new Text(key),new person());
Person p1 = new Person(1,"zahngsan")
String str = JSON.toJSON(p1)
context.write(new text(key),str)
複製程式碼

3、對於有些能夠避免的場景,儘量使用int替代String。因為String雖然比ArrayList、HashMap等資料結構高效多了,佔用記憶體量少多了,但是之前分析過,還是有額外資訊的消耗。比如之前用String表示id,那麼現在完全可以用數字型別的int,來進行替代。這裡提醒,在spark應用中,id就不要用常用的uuid了,因為無法轉成int,就用自增的int型別的id即可。(sdfsdfdf-234242342-sdfsfsfdfd)

相關文章