Java與大數據

Java在處理大數據結構時,常採用的工具包爲fastutil. java


fastutil擴展了 Java集合框架,經過提供特定類型的map、set、list和queue,以及小內存佔用、快速訪問和插入;也提供大(64位)array、set 和 list,以及快速、實用的 二進制文件和文本文件的I/O類。它是自由軟件,依照Apache許可證2.0發佈,須要Java 6或更高版本。 

類實現其標準接口(例如, map 的 Map),能夠插入現有代碼。此外,它們還提供未在標準類的附加??功能(如雙向迭代器) 。 

除了 對象和基本類型,fastutil類提供支持引用(references),即便用相等運算符,而不是比較對象的equals()方法。 

源代碼由C預處理器生成,從一組驅動文件開始。您能夠在查看javadoc生成的文檔。尤爲是概述說明中fastutil使用的設計選擇。 

大數據結構 
使用fastutil 6類的一組新類,使得它能夠處理很是大的集合,特別是其規模超過2 31 。大數組是數組的數組,由一個神奇的靜態方若是是帶有64爲索引的單位數組; big list 提供64位列表索引,hash big set 的 大小是隻受限於核心內存量。經常使用的方法來自java.util.Arrays,相似的類已經擴展到大數組:可查看Javadoc關於 BigArrays和 IntBigArrays 的文檔,以得到通用和特定類型的可用方法 。 

http://fastutil.dsi.unimi.it/ 

雖然JCF(Java Collections Framework)在設計作的很好,可是從性能很功能上都有必定的侷限性,全部出現不少的擴展JDK的集合框架出現,除了fastutil以外,主要的JDK集合框架的擴展還有如下這麼多,他們都各自有各自的特色,各有所長: 
git



因爲fastutil提供了至關豐富的類,因此類庫很大,好比fastutil-6.4.3.jar就有14.5MB。可是他在性能上極佳! 

fastutil以存儲的元素類型來劃分package,每一個package下都有豐富的Class。 
如: 
   List、BigList、Map、SortedMap、Set、Stack、Iterator...... 
  • it.unimi.dsi.fastutil.booleans
  • it.unimi.dsi.fastutil.bytes
  • it.unimi.dsi.fastutil.chars
  • it.unimi.dsi.fastutil.doubles
  • it.unimi.dsi.fastutil.floats
  • it.unimi.dsi.fastutil.ints
  • it.unimi.dsi.fastutil.io
  • it.unimi.dsi.fastutil.longs
  • it.unimi.dsi.fastutil.objects
  • it.unimi.dsi.fastutil.shorts


一、Int相關  
Java代碼   收藏代碼
  1. //===========IntList  
  2. IntList list = new IntArrayList();  
  3.   
  4. for(int i = 0; i < 1000; i++){  
  5.     list.add(i);  
  6. }  
  7.   
  8. //取值  
  9. int value = list.getInt(0);  
  10. System.out.println(value);// 0  
  11.   
  12. //轉成數組  
  13. int[] values = list.toIntArray();  
  14. System.out.println(values.length);// 1000  
  15.   
  16. //遍歷  
  17. IntListIterator i = list.iterator();  
  18. while(i.hasNext()){  
  19.     System.out.println(i.nextInt());  
  20. }  
  21.   
  22. //===========Int2BooleanMap  
  23. Int2BooleanMap map = new Int2BooleanArrayMap();  
  24.   
  25. map.put(1true);  
  26. map.put(2false);  
  27.   
  28. //取值  
  29. boolean value1 = map.get(1);  
  30. boolean value2 = map.get(2);  
  31.   
  32. System.out.println(value1);// true  
  33. System.out.println(value2);// false  
  34.   
  35. //===========IntBigList  
  36. IntBigList biglist = new IntBigArrayBigList();  
  37.   
  38. biglist.add(0);  
  39. biglist.add(1);  
  40. biglist.add(2);  
  41.   
  42. long size = biglist.size64();  
  43.   
  44. //取值  
  45. for(long index = 0; index < size; index++) {  
  46.     System.out.println(biglist.getInt(index));  
  47. }  
  48.   
  49. //===========IntSortedSet  
  50. IntSortedSet s = new IntLinkedOpenHashSet( new int[] { 4321 } );  
  51. //獲取第一個元素  
  52. System.out.println(s.firstInt()); // 4  
  53. //獲取最後一個元素  
  54. System.out.println(s.lastInt()); // 1  
  55. //判斷是否包含一個元素  
  56. System.out.println(s.contains(5)); // false  


二、Long相關  
Java代碼   收藏代碼
  1. Long2IntSortedMap m = new Long2IntAVLTreeMap();  
  2.   
  3. m.put( 15 );  
  4. m.put( 26 );  
  5. m.put( 37 );  
  6. m.put( 1000000000L, 10 );  
  7.   
  8. System.out.println(m.get( 1 )); // 5  
  9.   
  10. //當查找不到的時候,默認返回0  
  11. System.out.println(m.get( 4 )); // 0  
  12.   
  13. //設置默認返回值  
  14. m.defaultReturnValue( -1 );  
  15. System.out.println(m.get( 4 )); // -1  
  16.   
  17. //遍歷Map  
  18. LongBidirectionalIterator key1 = m.keySet().iterator();  
  19. long s = 0;  
  20. while( key1.hasNext() ) {  
  21.     s += key1.nextLong();  
  22. }  
  23. System.out.println(s); // 1000000006  
  24.   
  25. //獲取Key值小於4的子Map  
  26. Long2IntSortedMap m1 = m.headMap( 4 );  
  27. LongBidirectionalIterator key2 = m1.keySet().iterator();  
  28. while( key2.hasNext() ) {  
  29.     System.out.println(key2.nextLong());  
  30. }  
相關文章
相關標籤/搜索