欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java高效讀大文件(csv,text)的幾種處理方式

 更新時間:2024年07月03日 09:40:14   作者:w_l666  
這篇文章主要給大家介紹了關(guān)于java高效讀大文件(csv,text)的幾種處理方式,Java中處理大文件時,通常需要采取一些特定的策略來避免內(nèi)存溢出或性能問題,文中通過代碼及圖片介紹的非常詳細(xì),需要的朋友可以參考下

前言

當(dāng)我們在處理一個2G或者更大的文件數(shù)據(jù)時,往往是很耗系統(tǒng)性能的,處理不當(dāng)可能造成系統(tǒng)崩潰。接下來介紹四種讀取大文件的方式,以及每種方式的資源的調(diào)用情況。

方法1:Guava讀取

由于我是用的windows系統(tǒng),在 第一次測試時用了2G的文件,最后在讀取文件時,讀取了好久,最后報錯堆內(nèi)存溢出(由此可知,這種方式是基于內(nèi)存進行一次性讀取整個文件,文件越大,占用的資源越多)。然后 選用了一個624MB的csv文件進行測試。

代碼示例如下:

    @org.junit.Test
    public void testGuavaReadFile() throws IOException {
        //本次測試的這個outPut.csv文件的大小是624MB
        String filePath = "D:\\outPut.csv";
        File file = new File(filePath);
        Long startTime = System.currentTimeMillis();
        //進行文件的讀取,返回結(jié)果:每行數(shù)據(jù)都是一個string字符串
        List<String> lines = Files.readLines(file, Charsets.UTF_8);

        for (String line : lines) {
            // 在這里添加對每行數(shù)據(jù)的處理邏輯
            System.out.println("Processing line: " + line);
        }
        Long endTime = System.currentTimeMillis();
        long consume = (endTime - startTime)/1000;
        System.out.println("************總共耗時:"+consume+"秒*****************");
    }

監(jiān)控結(jié)果如下:

 從上圖可以看到:

時間消耗:20秒堆內(nèi)存:最高2.5GCPU消耗:最高50%

方式2:Apache Commons IO普通方式 

代碼如下:

    @org.junit.Test
    public void TestCommonsIoReadFile() throws IOException {
        //本次測試的這個outPut.csv文件的大小是624MB
        String filePath = "D:\\outPut.csv";
        File file = new File(filePath);
        Long startTime = System.currentTimeMillis();
        //Apache Commons IO普通方式讀取文件
        List<String> lines = FileUtils.readLines(file, "UTF-8");

        for (String line : lines) {
            // 在這里添加對每行數(shù)據(jù)的處理邏輯
            System.out.println("Processing line: " + line);
        }
        Long endTime = System.currentTimeMillis();
        long consume = (endTime - startTime)/1000;
        System.out.println("************CommonsIo方式總共耗時:"+consume+"秒*****************");
    }

運行結(jié)果:

從上圖可以看出: 

 時間消耗:17秒CPU消耗:最高50%,平穩(wěn)運行25%左右

方式3:java文件流

代碼如下:

@org.junit.Test
    public void TestJavaIoReadFile() throws IOException {
        //本次測試的這個outPut.csv文件的大小是624MB
        String filePath = "D:\\outPut.csv";
        Long startTime = System.currentTimeMillis();
        FileInputStream inputStream = null;
        Scanner scanner = null;

        try {
            inputStream = new FileInputStream(filePath);
            scanner = new Scanner(inputStream, "UTF-8");

            while (scanner.hasNextLine()) {
                //逐行讀取文件內(nèi)容
                String line = scanner.nextLine();
                System.out.println(line);
            }

            if (scanner.ioException() != null) {
                throw scanner.ioException();
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }

            if (scanner != null) {
                scanner.close();
            }
        }
        Long endTime = System.currentTimeMillis();
        long consume = (endTime - startTime)/1000;
        System.out.println("************CommonsIo方式總共耗時:"+consume+"秒*****************");
    }

運行結(jié)果:

從上圖可以看出:

時間消耗:32秒,增加了一倍堆內(nèi)存:最高1G,少了一半CPU消耗:平穩(wěn)運行25%左右 

方式4:Apache Commons IO流 

代碼如下:

 @org.junit.Test
    public void TestApacheCommonsIOReanFile() throws IOException {
        //本次測試的這個outPut.csv文件的大小是624MB
        String filePath = "D:\\outPut.csv";
        Long startTime = System.currentTimeMillis();
        LineIterator lineIterator = null;

        try {
            lineIterator = FileUtils.lineIterator(new File(filePath), "UTF-8");

            while (lineIterator.hasNext()) {
                String line = lineIterator.nextLine();
                System.out.println(line);
            }
        } finally {
            LineIterator.closeQuietly(lineIterator);
        }
        Long endTime = System.currentTimeMillis();
        long consume = (endTime - startTime)/1000;
        System.out.println("************CommonsIo方式總共耗時:"+consume+"秒*****************");
    }

 運行結(jié)果:

從上圖可以看出:

時間消耗:16秒,最低堆內(nèi)存:最高650M,少了一半

總結(jié) :

從四種方式可以看出,性能最優(yōu)的是Apache Commons IO流 對大文件的處理。

我們可以得出一個結(jié)論,如果我們想要讀取一個大文件,選擇了錯誤的方式,就有可能極大地占用我的內(nèi)存和CPU,當(dāng)文件特別大時,會造成意向不到的問題。

因此為了去解決這樣的問題,有四種常見的讀取大文件的方式。通過分析對比,發(fā)現(xiàn),Apache Commons IO流是最高效的一種方式。

到此這篇關(guān)于java高效讀大文件(csv,text)的幾種處理方式的文章就介紹到這了,更多相關(guān)java高效讀大文件csv,text內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的List接口實現(xiàn)類LinkList和ArrayList詳解

    Java中的List接口實現(xiàn)類LinkList和ArrayList詳解

    這篇文章主要介紹了Java中的List接口實現(xiàn)類LinkList和ArrayList詳解,List接口繼承自Collection接口,是單列集合的一個重要分支,實現(xiàn)了List接口的對象稱為List集合,在List集合中允許出現(xiàn)重復(fù)的元素,所有的元素是以一種線性方式進行存儲的,需要的朋友可以參考下
    2024-01-01
  • 詳解如何在Java項目中實現(xiàn)信號的連續(xù)接收

    詳解如何在Java項目中實現(xiàn)信號的連續(xù)接收

    在Java項目中,信號的連續(xù)接收是一項重要的任務(wù),特別是在處理異步事件或者需要對外部事件做出響應(yīng)時,本篇博客將介紹如何在Java項目中實現(xiàn)信號的連續(xù)接收,包括信號的監(jiān)聽、處理和停止等步驟,需要的朋友可以參考下
    2023-11-11
  • 使用Spring由構(gòu)造方法自動裝配

    使用Spring由構(gòu)造方法自動裝配

    這篇文章主要介紹了使用Spring由構(gòu)造方法自動裝配,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié)(附源碼下載地址)

    SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié)(附源碼下載地址)

    這篇文章主要介紹了SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié),并附源碼下載地址,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java Validation Api如何實現(xiàn)自定義注解

    Java Validation Api如何實現(xiàn)自定義注解

    這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java環(huán)境變量配置超詳細(xì)圖文教程

    java環(huán)境變量配置超詳細(xì)圖文教程

    在我們學(xué)習(xí)Java語言的時候,要在命令提示符里運用Java和Javac,用到這兩個命令的時候就要配置Java環(huán)節(jié)變量才可以,這篇文章主要給大家介紹了關(guān)于java環(huán)境變量配置的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • SpringBoot項目實戰(zhàn)之?dāng)?shù)據(jù)交互篇

    SpringBoot項目實戰(zhàn)之?dāng)?shù)據(jù)交互篇

    這篇文章主要給大家介紹了關(guān)于SpringBoot項目實戰(zhàn)之?dāng)?shù)據(jù)交互篇的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • JAVA LinkedList和ArrayList的使用及性能分析

    JAVA LinkedList和ArrayList的使用及性能分析

    JAVA LinkedList和ArrayList的使用及性能分析,這篇文章也是以JAVA List的總結(jié)。
    2013-11-11
  • java中staticclass靜態(tài)類詳解

    java中staticclass靜態(tài)類詳解

    這篇文章主要介紹了java中staticclass靜態(tài)類詳解,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解

    SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解

    這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11

最新評論