大數據導出java,大數據導出fullgc

本文目錄一覽:

怎麼使用java導出大數據為xml文件

dom4j可以試試,不知道你的數據量有多大,如果太大的話,我沒試過

xml文件是有規律的,你可以把要導出的數據構造一下,

我有個簡單的代碼

package com.test.xml;

import java.io.FileWriter;

import java.io.IOException;

import java.io.Writer;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

public class Dom4JXML {

    

    public void createXML() {

        //用工廠類創建一個document實例

        Document doc = DocumentHelper.createDocument();

        //創建根元素emps

        Element rootEle = doc.addElement(“emps”);

        //添加註釋

        rootEle.addComment(“這是一個dom4j生成的xml文件”);

        //emps根節點下創建一個emp節點

        Element empEle = rootEle.addElement(“emp”);

        //emp添加屬性id=”1″

        empEle.addAttribute(“id”, “1”);

        //emp節點下創建一個name節點

        Element nameEle = empEle.addElement(“name”);

        //name節點下創建一個文本節點zhangsan

        nameEle.setText(“zhangsan”);

        //再為name節點創建一個兄弟節點

        Element sexEle = empEle.addElement(“sex”);

        sexEle.setText(“man”);

        //將document中的內容寫入文件中

        try {

            Writer out = new FileWriter(“F:\\emps.xml”);

            //格式化輸出,類型IE瀏覽一樣

            OutputFormat format = OutputFormat.createPrettyPrint();

            //OutputFormat format = OutputFormat.createCompactFormat();

            format.setEncoding(“UTF-8”);

            //創建寫出對象

            XMLWriter writer = new XMLWriter(out,format);

            writer.write(doc);

            writer.close();

            System.out.println(“生成emps.xml成功。”);

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            System.out.println(“失敗了。”);

        }

    }

    

    public static void main(String[] args) {

        new Dom4JXML().createXML();

    }

}

然而從xml文件中解析以後的數據收集可以用SAX試試看

我這裡有個簡單的例子

package com.test.xml;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class SAXParseHandler extends DefaultHandler{

public void startDocument()throws SAXException{

System.out.println(“起始文擋”);

}

public void endDocument()throws SAXException{

System.out.println(“結束文擋”);

}

public void characters(char[] ch,int start,int length)throws SAXException{

String charString=new String(ch,start,length);

System.out.println(“字元:”+charString);

}

public void startElement(String namespaceURI,String localName,String qName,Attributes atts)throws SAXException{

System.out.println(“起始元素:”+qName);

for(int i=0;iatts.getLength();i++){

System.out.println(“屬性值:”+atts.getValue(i));

}

}

public void endElement(String namespaceURI,String localName,String qName)throws SAXException{

System.out.println(“結束元素:”+qName);

}

}

package com.test.xml;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

public class Books {

/**

 * @param args

 */

public static void main(String[] args) throws Exception{

// TODO 自動生成方法存根

SAXParserFactory factory=SAXParserFactory.newInstance();

SAXParser parser=factory.newSAXParser();

parser.parse(“booksamp.xml”,new SAXParseHandler());

}

}

Java 大數據量導出,該怎麼解決

對於數據規模太大的,做成任務。

用戶點擊導出,檢查他的數據規模,超過50W的,提示其數據規模過大,可能需要 N 小時完成,請稍候再來查詢和下載導出結果。如果用戶點擊確定,你就提示:「任務已進入隊列,點擊此連接查詢導出進度。」

然後你要做兩件事情:

1、給這個用戶記錄個標識,就是他已經啟動某導出任務,不能再啟動新的了(或者限制一個人最多同時啟動幾個導出任務);

2、後台有個調度程序,開始執行導出工作,並將生成的Excel放在某磁碟目錄或存在資料庫中;這個調度任務可以控制下最大同時並發的導出任務數,以避免任務太多拖垮系統。

另外需要開發界面查詢導出進度以及下載導出結果。導出結果可以考慮一個最大保存周期,比如7天。

java怎麼在數據超過百萬後分頁導出

用過POI的人都知道,在POI以前的版本中並不支持大數據量的處理,如果數據量過多還會常報OOM錯誤,

這時候調整JVM的配置參數

也不是一個好對策(註:

jdk在32位系統中支持的內存不能超過2個G,而在64位中沒有限制,但是在64位的系統中,性能並不是太好

),好在POI3.8版本新出來了一個SXSSFWorkbook對象,它就是用來解決大數據量以及超大數據量的導入導出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件。

這裡普及一下,在POI中使用HSSF對象時,excel 2003最多只允許存6553數據,一般用來處理較少的數據量,這時對於百萬級別數據,Excel肯定

容納不了,而且在計算機性能稍低的機器上測試,就很容易導致堆溢出。當我升級到XSSF對象時,它可以直接支持excel2007以上版本,因為它採用

ooxml格式。這時excel可以支持1048576條數據,單個sheet表就支持近104

萬條數據了,雖然這時導出100萬數據能滿足要求,但使用XSSF測試後發現偶爾還是會發生堆溢出,所以也不適合百萬數據的導出。現在我們知道excel2007及以上版本可以輕鬆實現存儲百萬級別的數據,但是系統中的大量數據是如何能夠快速準確的導入到excel中這好像是個難題,對於一般的web系統,我們為了解決成本,基本都是使用的入門級web伺服器tomcat,既然我們不推薦調整JVM的大小,那我們就要針對我們的代碼來解決我們要解決的問題。在POI3.8之後新增加了一個類,

SXSSFWorkbook

,採用當數據加工時不是類似前面版本的對象,它可以控制excel數據佔用的內存,他通過控制在內存中的行數來實現資源管理,即當創建對象超過了設定的行數,它會自動刷新內存,將數據寫入文件,

這樣導致列印時,佔用的CPU,和內存很少。但有人會說了,我用過這個類啊,他好像並不能完全解決,當數據量超過一定量後還是會內存溢出的,而且時間還很長。對你只是用了這個類,但是你並沒有針對你的需求進行相應的設計,僅僅是用了,所以接下來我要說的問題就是,如何通過SXSSFWorkbook以及相應的寫入設計來實現百萬級別的數據快速寫入。

我先舉個例子,以前我們[資料庫

中存在大量的數據,我們要查詢,怎麼辦?我們在沒有經過設計的時候是這樣來處理的,先寫一個集合,然後執行jdbc,將返回的結果賦值給list,然後再返回到頁面上,但是當數據量大的時候,就會出現數據無法返回,內存溢出的情況,於是我們在有限的時間和空間下,通過分頁將數據一頁一頁的顯示出來,這樣可以避免了[大數據

量數據對內存的佔用,也提高了用戶的體驗,在我們要導出的百萬數據也是一個道理,內存突發性佔用,我們可以限制導出數據所佔用的內存,

這裡我先建立一個list容器,list中開闢10000行的存儲空間,每次存儲10000行,用完了將內容清空,然後重複利用

,這樣就可以有效控制內存,所以我們的設計思路就基本形成了,所以分頁數據導出共有以下3個步驟:

1、求資料庫中待導出數據的行數

2、根據行數求數據提取次數

3、按次數將數據寫入文件

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254135.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 17:40
下一篇 2024-12-14 17:40

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論