對於數據規模復太大的,做成制任務。
用戶點擊導出,檢查他的數據規模,超過50W的,提示其數據規模過大,可能需要 N 小時完成,請稍候再來查詢和下載導出結果。如果用戶點擊確定,你就提示:「任務已進入隊列,點擊此連接查詢導出進度。」
然後你要做兩件事情:
1、給這個用戶記錄個標識,就是他已經啟動某導出任務,不能再啟動新的了(或者限制一個人最多同時啟動幾個導出任務);
2、後台有個調度程序,開始執行導出工作,並將生成的Excel放在某磁碟目錄或存在資料庫中;這個調度任務可以控制下最大同時並發的導出任務數,以避免任務太多拖垮系統。
另外需要開發界面查詢導出進度以及下載導出結果。導出結果可以考慮一個最大保存周期,比如7天。
Ⅱ java中大量數據如何提高性能
通過使用一些輔助性工具來找到程式中的瓶頸,然後就能對瓶頸部分的代碼進行優化。一般有兩種方案:即優化代碼或更改設計方法。我們一般會選擇後者,因為不去調用以下代碼要比調用一些優化的代碼更能提高程式的性能。而一個設計良好的程式能夠精簡代碼,從而提高性能。
????下面將提供一些在JAVA程式的設計和編碼中,為了能夠提高JAVA程式的性能,而經常採用的一些方法和技巧。
????1.對象的生成和大小的調整。
????JAVA程式設計中一個普遍的問題就是沒有好好的利用JAVA語言本身提供的函數,從而常常會生成大量的對象(或實例)。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程式的性能帶來非常大的影響。
????例1:關於String ,StringBuffer,+和append
????JAVA語言提供了對於String類型變數的操作。但如果使用不當,會給程式的性能帶來影響。如下面的語句:
????String name=new String("HuangWeiFeng");
????System.out.println(name+"is my name");
????看似已非常精簡了,其實並非如此。為了生成二進制的代碼,要進行如下的步驟和操作:
????(1) 生成新的字元串 new String(STR_1);
????(2) 復制該字元串;
????(3) 載入字元串常量"HuangWeiFeng"(STR_2);
????(4) 調用字元串的構架器(Constructor);
????(5) 保存該字元串到數組中(從位置0開始);
????(6) 從java.io.PrintStream類中得到靜態的out變數;
????(7) 生成新的字元串緩沖變數new StringBuffer(STR_BUF_1);
????(8) 復制該字元串緩沖變數;
????(9) 調用字元串緩沖的構架器(Constructor);
????(10) 保存該字元串緩沖到數組中(從位置1開始);
????(11) 以STR_1為參數,調用字元串緩沖(StringBuffer)類中的append方法;
????(12) 載入字元串常量"is my name"(STR_3);
????(13) 以STR_3為參數,調用字元串緩沖(StringBuffer)類中的append方法;
????(14) 對於STR_BUF_1執行toString命令;
????(15) 調用out變數中的println方法,輸出結果。
????由此能看出,這兩行簡單的代碼,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五個對象變數。這些生成的類的實例一般都存放在堆中。堆要對所有類的超類,類的實例進行初始化,同時還要調用類極其每個超類的構架器。而這些操作都是非常消耗系統資源的。因此,對對象的生成進行限制,是完全有必要的。
????經修改,上面的代碼能用如下的代碼來替換。
????StringBuffer name=new StringBuffer("HuangWeiFeng");
????System.out.println(name.append("is my name.").toString());
????系統將進行如下的操作:
????(1) 生成新的字元串緩沖變數new StringBuffer(STR_BUF_1);
????(2) 復制該字元串緩沖變數;
????(3) 載入字元串常量"HuangWeiFeng"(STR_1);
????(4) 調用字元串緩沖的構架器(Constructor);
????(5) 保存該字元串緩沖到數組中(從位置1開始);
????(6) 從java.io.PrintStream類中得到靜態的out變數;
????(7) 載入STR_BUF_1;
????(8) 載入字元串常量"is my name"(STR_2);
????(9) 以STR_2為參數,調用字元串緩沖(StringBuffer)實例中的append方法;
????(10) 對於STR_BUF_1執行toString命令(STR_3);
????(11)調用out變數中的println方法,輸出結果。
????由此能看出,經過改進後的代碼只生成了四個對象變數:STR_1,STR_2,STR_3和STR_BUF_1.你可能覺得少生成一個對象不會對程式的性能有非常大的提高。但下面的代碼段2的執行速度將是代碼段1的2倍。因為代碼段1生成了八個對象,而代碼段2隻生成了四個對象。
????代碼段1:
????String name= new StringBuffer("HuangWeiFeng");
????name+="is my";
????name+="name";
????代碼段2:
????StringBuffer name=new StringBuffer("HuangWeiFeng");
????name.append("is my");
????name.append("name.").toString();
????因此,充分的利用JAVA提供的庫函數來優化程式,對提高JAVA程式的性能時非常重要的.其注意點主要有如下幾方面;
????(1) 盡可能的使用靜態變數(Static Class Variables)
????如果類中的變數不會隨他的實例而變化,就能定義為靜態變數,從而使他所有的實例都共享這個變數。
????例:
????public class foo
????{
??????SomeObject so=new SomeObject();
????}
????就能定義為:
????public class foo
????{
??????static SomeObject so=new SomeObject();
????}
????(2) 不要對已生成的對象作過多的改動。
????對於一些類(如:String類)來講,寧願在重新生成一個新的對象實例,而不應該修改已生成的對象實例。
????例:
????String name="Huang";
????name="Wei";
????name="Feng";
????上述代碼生成了三個String類型的對象實例。而前兩個馬上就需要系統進行垃圾回收處理。如果要對字元串進行連接的操作,性能將得更差,因為系統將不得為此生成更多得臨時變數,如上例1所示。
????(3) 生成對象時,要分配給他合理的空間和大小JAVA中的非常多類都有他的默認的空間分配大小。對於StringBuffer類來講,默認的分配空間大小是16個字元。如果在程式中使用StringBuffer的空間大小不是16個字元,那麼就必須進行正確的初始化。
????(4) 避免生成不太使用或生命周期短的對象或變數。對於這種情況,因該定義一個對象緩沖池。以為管理一個對象緩沖池的開銷要比頻繁的生成和回收對象的開銷小的多。
????(5) 只在對象作用范圍內進行初始化。JAVA允許在代碼的所有地方定義和初始化對象。這樣,就能只在對象作用的范圍內進行初始化。從而節約系統的開銷。
????例:
????SomeObject so=new SomeObject();
????If(x==1) then
????{
??????Foo=so.getXX();
????}
????能修改為:
????if(x==1) then
????{
??????SomeObject so=new SomeObject();
??????Foo=so.getXX();
????}
????2.異常(Exceptions)
????JAVA語言中提供了try/catch來發方便用戶捕捉異常,進行異常的處理。不過如果使用不當,也會給JAVA程式的性能帶來影響。因此,要注意以下兩點:
????(1) 避免對應用程式的邏輯使用try/catch
????如果能用if,while等邏輯語句來處理,那麼就盡可能的不用try/catch語句。
????(2) 重用異常
????在必須要進行異常的處理時,要盡可能的重用已存在的異常對象。以為在異常的處理中,生成一個異常對象要消耗掉大部分的時間。
????3. 線程(Threading)
????一個高性能的應用程式中一般都會用到線程。因為線程能充分利用系統的資源。在其他線程因為等待硬碟或網路讀寫而 時,程式能繼續處理和運行。不過對線程運用不當,也會影響程式的性能。
????例2:正確使用Vector類
????Vector主要用來保存各種類型的對象(包括相同類型和不同類型的對象)。不過在一些情況下使用會給程式帶來性能上的影響。這主要是由Vector類的兩個特點所決定的。第一,Vector提供了線程的安全保護功能。即使Vector類中的許多方法同步。不過如果你已確認你的應用程式是單線程,這些方法的同步就完全不必要了。第二,在Vector查找存儲的各種對象時,常常要花非常多的時間進行類型的匹配。而當這些對象都是同一類型時,這些匹配就完全不必要了。因此,有必要設計一個單線程的,保存特定類型對象的類或集合來替代Vector類.用來替換的程式如下(StringVector.java):
????public class StringVector
????{
??????private String [] data;
??????private int count;
??????public StringVector()
??????{
????????this(10); // default size is 10
??????}
??????public StringVector(int initialSize)
??????{
????????data = new String[initialSize];
??????}
??????public void add(String str)
??????{
??????// ignore null strings
??????if(str == null) { return; }
??????ensureCapacity(count + 1);
??????data[count++] = str;
??????}
??????private void ensureCapacity(int minCapacity)
??????{
????????int oldCapacity = data.length;
????????if (minCapacity > oldCapacity)
????????{
??????????String oldData[] = data;
??????????int newCapacity = oldCapacity * 2;
??????????data = new String[newCapacity];
??????????System.array(oldData, 0, data, 0, count);
????????}
??????}
??????public void remove(String str)
??????{
??????if(str == null) { return; // ignore null str }
??????for(int i = 0; i < count; i++)
??????{
????????// check for a match
????????if(data[i].equals(str))
????????{
??????????System.array(data,i+1,data,i,count-1); // data
??????????// allow previously valid array element be gc
Ⅲ JAVA開源大數據查詢分析引擎有哪些方案
大數據查詢分析是雲計算中核心問題之一,自從Google在2006年之前的幾篇論文奠定雲計算領域基礎,尤其是GFS、Map-Rece、 Bigtable被稱為雲計算底層技術三大基石。GFS、Map-Rece技術直接支持了Apache Hadoop項目的誕生。Bigtable和Amazon Dynamo直接催生了NoSQL這個嶄新的資料庫領域,撼動了RDBMS在商用資料庫和數據倉庫方面幾十年的統治性地位。FaceBook的Hive項 目是建立在Hadoop上的數據倉庫基礎構架,提供了一系列用於存儲、查詢和分析大規模數據的工具。當我們還浸淫在GFS、Map-Rece、 Bigtable等Google技術中,並進行理解、掌握、模仿時,Google在2009年之後,連續推出多項新技術,包括:Dremel、 Pregel、Percolator、Spanner和F1。其中,Dremel促使了實時計算系統的興起,Pregel開辟了圖數據計算這個新方 向,Percolator使分布式增量索引更新成為文本檢索領域的新標准,Spanner和F1向我們展現了跨數據中心資料庫的可能。在Google的第 二波技術浪潮中,基於Hive和Dremel,新興的大數據公司Cloudera開源了大數據查詢分析引擎Impala,Hortonworks開源了 Stinger,Fackbook開源了Presto。類似Pregel,UC Berkeley AMPLAB實驗室開發了Spark圖計算框架,並以Spark為核心開源了大數據查詢分析引擎Shark。由於
Ⅳ Java EE開發中大數據處理用什麼技術最好
本身你的問題就不具體
你怎麼讓別人跟你講具體呢
大數據處理無非就是以下大類
集群分散處理
緩存
非同步處理
也就是說,java web端要用集群做負載,將高並發分散到不同的伺服器去處理
那麼,由於數據量可能非常大,還需要有單獨的緩存伺服器,將session,資料庫等緩存到某伺服器(緩存伺服器只對內存有要求,CPU及硬碟要求不高)
之勢就是非同步處理數據了,比如說某個界面可能要一次查一萬條數據,你可以在前面用ajax一次查100,非同步的查出來增加到界面,用戶是感覺不出來的
Ⅳ 如何處理java web項目中大數據量處理問題
既然是非同步處理,那就是不和客戶的請求同時進行,所以也和session無關了。非同步處理也版和EJB沒關系。權
1。當客戶請求數據操作的時候,你的javabean把請求存放到文件裡面,然後就可以返回response給客戶了。
2。自己做一個application program,是thread,隔一段時間監聽那個文件(或者一個目錄),如果發現有新的文件,就讀取出來,根據要求進行長時間操作。操作完畢,更新一個flag A(可在資料庫,可在文件),並且把操作的文件remove(以免重復對此文件操作)。
3。客戶總會不定時刷新頁面或者發新頁面請求,這時候就察看flag A,如果完成,就在頁面上提示用戶,就如msdn的「你有短消息「
Ⅵ 使用java開發B/S的大數據分析軟體 應該用什麼框架新手勿噴
在大數據處理分析過程中常用的六大工具:
Hadoop
Hadoop 是一個能夠對大量數據進行分布式處理的軟體框架。但是 Hadoop 是以一種可靠、高效、可伸縮的方式進行處理的。Hadoop 是可靠的,因為它假設計算元素和存儲會失敗,因此它維護多個工作數據副本,確保能夠針對失敗的節點重新分布處理。Hadoop 是高效的,因為它以並行的方式工作,通過並行處理加快處理速度。Hadoop 還是可伸縮的,能夠處理 PB 級數據。此外,Hadoop 依賴於社區伺服器,因此它的成本比較低,任何人都可以使用。
HPCC
HPCC,High Performance Computing and Communications(高性能計算與通信)的縮寫。1993年,由美國科學、工程、技術聯邦協調理事會向國會提交了逗重大挑戰項目:高性能計算與 通信地的報告,也就是被稱為HPCC計劃的報告,即美國總統科學戰略項目,其目的是通過加強研究與開發解決一批重要的科學與技術挑戰問題。HPCC是美國 實施信息高速公路而上實施的計劃,該計劃的實施將耗資百億美元,其主要目標要達到:開發可擴展的計算系統及相關軟體,以支持太位級網路傳輸性能,開發千兆 比特網路技術,擴展研究和教育機構及網路連接能力。
Storm
Storm是自由的開源軟體,一個分布式的、容錯的實時計算系統。Storm可以非常可靠的處理龐大的數據流,用於處理Hadoop的批量數據。Storm很簡單,支持許多種編程語言,使用起來非常有趣。
Apache Drill
為了幫助企業用戶尋找更為有效、加快Hadoop數據查詢的方法,Apache軟體會近日發起了一項名為逗Drill地的開源項目。Apache Drill 實現了 Google's Dremel.
據Hadoop廠商MapR Technologies公司產品經理Tomer Shiran介紹,逗Drill地已經作為Apache孵化器項目來運作,將面向全球軟體工程師持續推廣。
RapidMiner
RapidMiner是世界領先的數據挖掘解決方案,在一個非常大的程度上有著先進技術。它數據挖掘任務涉及范圍廣泛,包括各種數據藝術,能簡化數據挖掘過程的設計和評價。
Ⅶ 怎樣使用Java 開發大數據
未來10年將是大數據,人工智慧爆發的時代,到時將會有大量的企業需要藉助大數據,而Java最大的優勢就是它在大數據領域的地位,目前很多的大數據架構都是通過Java來完成的。
在這個Android、iOS相繼沒落,PHP相繼飽和的時候,只有Java大數據保持著旺盛的需求。那麼,Java大數據需要學習什麼技術呢?
首先我們要學習Java語言和Linux操作系統。很多人入門編程語言就是Java,你或許還不知道Java的方向有JavaSE、JavaEE、JavaME,學習Java大數據需要學習JavaSE、JavaEE。了解Java怎麼連接資料庫,掌握JDBC,學習Hibernate/Mybatis的原理,以及API,這樣可以增加你對Java操作資料庫的理解,因為這兩個技術的核心就是Java的反射加上JDBC的各種使用。
接下來就需要學習Linux操作系統,因為大數據相關軟體都是在Linux上運行的,學好Linux對你快速掌握大數據相關技術有很大的幫助,能讓你更好的理解hadoop、hive、hbase、spark等大數據軟體的運行環境和網路環境配置,能少踩很多坑,學會shell就能看懂腳本,這樣能更容易理解和配置大數據集群。還能讓你對以後新出的大數據技術學習起來更快。
最後當然是Hadoop的學習,這幾乎已經成為大數據的代名詞,Hadoop裡麵包括組件HDFS、MapRece和YARN,HDFS是存儲數據的地方,就像電腦的硬碟一樣,文件都存儲在這個上面,MapRece是對數據進行處理計算的,它有個特點就是不管多大的數據只要給它時間它就能把數據跑完,但是時間可能不是很快,所以它叫數據的批處理。YARN是體現Hadoop平台概念的重要組件,有了它大數據生態體系的其它軟體就能在hadoop上運行了,這樣就能更好的利用HDFS大存儲的優勢和節省更多的資源,比如我們就不用再單獨建一個spark的集群了,讓它直接跑在現有的hadoop yarn上面就可以了。
學了這些,可以勝任初級Java工程師了,當然還是有很有可以提高的地方,比如學習下python,可以用它來編寫網路爬蟲。這樣我們就可以自己造數據了,網路上的各種數據你高興都可以下載到你的集群上去處理。