大數據問題的常見解決辦法


一、去重

去重: 用布隆過濾器,就是一個bitmap,但是有k個哈希函數,僅當一個數據的k個哈希函數找出的位置全部為1時,才表示這個數據在集合中,但是它也有一定的誤判率,會把不存在的判斷為存在,寧可錯殺1000,不肯放過一個的這種,因此他不適合作0誤判的場合,並且刪除也不方便,你還不如重建一個布隆過濾器;
 
它很合適需要迅速判斷一個元素是否在一個集合中,比如:
  • 爬取URL時,避免爬重;
  • 反垃圾郵件、垃圾短信,從數十億的郵件列表中判斷郵箱是否是垃圾郵箱(看接收人數的);
  • 緩存擊穿,將已存在的緩存放到布隆過濾器,這樣當黑客訪問不存在的緩存時迅速返回避免緩存及數據庫掛掉;
 
還有一種就是直接擴大物理內存的,用分布式的Redis來實現,setnx,還有犧牲效率的,用哈希和輔助磁盤;
 

二、從很多數據中選擇最大的幾個數

小根堆,之所以用小根堆是因為:小根堆的堆頂元素是最小的那個,如果遍歷的時候當前數據比堆頂元素都小,肯定不在最大的n個數之類,反之,就應該將當前數據加入到根堆(刪除當前堆頂元素),並調整這個堆,繼續操作,直到遍歷完所有數據,根堆中剩余的數據就是最大的幾個數;
 
需要找最大的N個數,只需要建立N個節點的小根堆就好了,找最小的反過來,邏輯一樣;
 

三、大數據如何存儲:

  1. 首先考慮換用更大的數據類型;
  2. 還是放不下的話就只能是數組去存放了(字符串也可以,但是它其實也是char類型的數組);
 

四、小數如何存儲:

  1. 首先選用float、double類型的;
  2. 用字符串格式化數據:
        //利用字符串格式化的方式實現 四舍五入,保留1位小數
        String str1 = String.format("%.1f",d1);// 1代表小數點后面的位數, 不足補0 . f代表,后面的數據d1是浮點類型
  1. 使用BigDecimal:
        //利用BigDecimal來實現四舍五入.保留一位小數
        double f1 = new BigDecimal(d1).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
        //1 代表保留1位小數
        //BigDecimal.ROUND_HALF_UP 代表使用四舍五入的方式

  

五、日期如何獲取

日期如何獲取和存儲:
  1. 獲取標准時間可以通過System.currentTimeMillis()方法獲取,此方法不受時區影響,得到的結果是時間戳格式的:
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println(formatter.format(date));
  1. Calendar類,專門用於轉換特定時刻和日歷字段之間的日期和時間:
Calendar calendar = Calendar.getInstance(); 
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
System.out.println(formatter.format(calendar.getTime()));
  1. Java 8提供了一個全新的API,用以替換java.util.Date和java.util.Calendar。Date / Time API提供了多個類,幫助我們來完成工作,包括:LocalDate、LocalTime、LocalDateTime、ZonedDateTime;
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dateTime.format(formatter));
 
如果想獲取前幾天或者后幾天的時間:
//獲取一個Calendar對象,bai默du認帶的是當前時間,想zhi設置可以使用Set方法
Calendar ca = Calendar.getInstance();
//使用add方法,前面的參數是調整的變量,這里設置的是日期,第二個變量是正數則是往后推,負數是往前推
ca.add(Calendar.DATE,-1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//getTime返回的是Date對象,然后SimpleDateFormat進行格式化輸出
System.out.println(sdf.format(ca.getTime()));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM