java高效讀大文件(csv,text)的幾種處理方式
前言
當(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詳解,List接口繼承自Collection接口,是單列集合的一個重要分支,實現(xiàn)了List接口的對象稱為List集合,在List集合中允許出現(xiàn)重復(fù)的元素,所有的元素是以一種線性方式進行存儲的,需要的朋友可以參考下2024-01-01詳解如何在Java項目中實現(xiàn)信號的連續(xù)接收
在Java項目中,信號的連續(xù)接收是一項重要的任務(wù),特別是在處理異步事件或者需要對外部事件做出響應(yīng)時,本篇博客將介紹如何在Java項目中實現(xiàn)信號的連續(xù)接收,包括信號的監(jiān)聽、處理和停止等步驟,需要的朋友可以參考下2023-11-11SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié)(附源碼下載地址)
這篇文章主要介紹了SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié),并附源碼下載地址,感興趣的小伙伴們可以參考一下2016-06-06Java Validation Api如何實現(xiàn)自定義注解
這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09SpringBoot項目實戰(zhàn)之?dāng)?shù)據(jù)交互篇
這篇文章主要給大家介紹了關(guān)于SpringBoot項目實戰(zhàn)之?dāng)?shù)據(jù)交互篇的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03JAVA LinkedList和ArrayList的使用及性能分析
JAVA LinkedList和ArrayList的使用及性能分析,這篇文章也是以JAVA List的總結(jié)。2013-11-11SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解
這篇文章主要介紹了SpringMVC攔截器實現(xiàn)監(jiān)聽session是否過期詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11