1. 程式人生 > >java 對大資料的處理

java 對大資料的處理

最近做了一個專案,資料量每次處理在兩百萬左右,這裡記錄一下最近開發時處理大量資料的思路,主要思路是將大資料化小,多次處理,不足之處還請指出。

檔案讀取:首先是一個檔案上傳,資料入庫,10-200萬條不等,這裡主要考慮到一次性讀取,JVM分配出來的棧記憶體不一定會夠(個人對記憶體這一塊還是處於一知半解的狀態,所以比較謹慎,若諸位大神有好的認知,希望評論留下地址分享一下),是依行讀取資料,設定一個批量值,當讀取的資料達到一定量之後,執行批量入庫操作,清空集合,再接著讀取。

//讀取檔案內容
while((s = br.readLine())!=null){
//判斷是否達到單次處理量
if(num%leadingNum==0&&num!=0){
int a = stencDao.insertBatch(listBean);
if(a!=leadingNum){
flag = false;
}
//清空集合
listBean.clear();
}
String value = s.trim();
//將讀取到的內容放入集合中
if(!value.equals("")){
StencilCustomer bean = new StencilCustomer();
bean.setCustomerPhone(value);
bean.setLinkStencilId(id);
listBean.add(bean);
num ++;
}
}

資料處理:這裡的思路也是將資料小化然後處理,這裡使用了多執行緒,設定單個執行緒處理量,然後開啟多個執行緒處理,這裡需要考慮你的伺服器的承載能力,如果執行緒開得太多了,處理不過來,會出現蹦死的情況。例如200萬資料,我開了20個執行緒,單個執行緒處理600條。

//建立一個執行緒池  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(minTaskNumber),
new ThreadPoolExecutor.DiscardOldestPolicy());

//當正在執行的執行緒數達到最大執行執行緒數的時候等待
boolean flag = true;
while(flag){
Thread.sleep(1000);//休眠2ms查詢一次
int c = threadPool.getActiveCount();//執行緒池中活動中的執行緒數量
if(c<maxTaskNumber){
flag = false;
}
}

上面的程式碼是我對執行緒池的一個控制,控制伺服器一直最大執行緒執行,Thread.sleep(1000);用while的時候,這個休眠最好不要去掉,去掉之後很影響執行效率。