最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教新手使用java如何對一個大的文本文件內容進行去重

 更新時間:2021年06月22日 11:19:47   作者:wei503316325  
用HashSet對內容去重這個過程jvm會內存溢出,只能首先將這個大文件中的內容讀取出來,對每行String的hashCode取模取正整數,可用取模結果作為文件名,將相同模數的行寫入同一個文件,再單獨對每個小文件進行去重,最后再合并

有內存溢出風險的寫法:

	public static void distinct() {
		File ff = new File("G://password/all.txt");
		File distinctedFile = new File("G://password/all-distinced.txt");
		PrintWriter pw = null;
		Set<String> allHash = null;
		FileReader fr = null;
		BufferedReader br = null;
		try {
			pw = new PrintWriter(distinctedFile);
			allHash = new HashSet<String>();
			fr = new FileReader(ff);
			br = new BufferedReader(fr);
			String line = null;
			while((line=br.readLine())!=null){
				line = line.trim();
				if(line != ""){
					allHash.add(line);
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(null != fr){
					fr.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(null != br){
					br.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		for(String s:allHash){
			pw.println(s);
		}
		pw.close();
	}

jvm內存溢出:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.HashMap.newNode(HashMap.java:1734)
	at java.util.HashMap.putVal(HashMap.java:630)
	at java.util.HashMap.put(HashMap.java:611)
	at java.util.HashSet.add(HashSet.java:219)
	at encode.Main.distinct(Main.java:180)
	at encode.Main.main(Main.java:215)

通過hashCode取模拆分寫法:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;
public class DistinctFileUtil {
	/**
	 * 將文件hash取模之后放到不同的小文件中
	 * @param targetFile 要去重的文件路徑
	 * @param splitSize 將目標文件切割成多少份hash取模的小文件個數
	 * @return
	 */
	public static File[] splitFile(String targetFile,int splitSize){
		File file = new File(targetFile);
		BufferedReader reader = null;
		PrintWriter[] pws = new PrintWriter[splitSize];
		File[] littleFiles = new File[splitSize];
		String parentPath = file.getParent();
		File tempFolder = new File(parentPath + File.separator + "test");
		if(!tempFolder.exists()){
			tempFolder.mkdir();
		}
		for(int i=0;i<splitSize;i++){
			littleFiles[i] = new File(tempFolder.getAbsolutePath() + File.separator + i + ".txt");
			if(littleFiles[i].exists()){
				littleFiles[i].delete();
			}
			try {
				pws[i] = new PrintWriter(littleFiles[i]);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		}
		try {
			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
			while ((tempString = reader.readLine()) != null) {
				tempString = tempString.trim();
				if(tempString != ""){
					//關鍵是將每行數據hash取模之后放到對應取模值的文件中,確保hash值相同的字符串都在同一個文件里面
					int index = Math.abs(tempString.hashCode() % splitSize);
					pws[index].println(tempString);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			for(int i=0;i<splitSize;i++){
				if(pws[i] != null){
					pws[i].close();
				}
			}
		}
		return littleFiles;
	}
	/**
	 * 對小文件進行去重合并
	 * @param littleFiles 切割之后的小文件數組
	 * @param distinctFilePath 去重之后的文件路徑
	 * @param splitSize 小文件大小
	 */
	public static void distinct(File[] littleFiles,String distinctFilePath,int splitSize){
		File distinctedFile = new File(distinctFilePath);
		FileReader[] frs = new FileReader[splitSize];
		BufferedReader[] brs = new BufferedReader[splitSize];
		PrintWriter pw = null;
		try {
			if(distinctedFile.exists()){
				distinctedFile.delete();
			}
			distinctedFile.createNewFile();
			pw = new PrintWriter(distinctedFile);
			Set<String> unicSet = new HashSet<String>();
			for(int i=0;i<splitSize;i++){
				if(littleFiles[i].exists()){
					System.out.println("開始對小文件:" + littleFiles[i].getName() + "去重");
					frs[i] = new FileReader(littleFiles[i]);
					brs[i] = new BufferedReader(frs[i]);
					String line = null;
					while((line = brs[i].readLine())!=null){
						if(line != ""){
							unicSet.add(line);
						}
					}
					for(String s:unicSet){
						pw.println(s);
					}
					unicSet.clear();
					System.gc();
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1){
			e1.printStackTrace();
		} finally {
			for(int i=0;i<splitSize;i++){
				try {
					if(null != brs[i]){
						brs[i].close();
					}
					if(null != frs[i]){
						frs[i].close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
				//合并完成之后刪除臨時小文件
				if(littleFiles[i].exists()){
					littleFiles[i].delete();
				}
			}
			if(null != pw){
				pw.close();
			}
		}
	}
	public static void main(String[] args) throws IOException {
		int splitSize = 20;
		File[] files = splitFile("G://test/bigfile.txt",splitSize);
		distinct(files,"G://test/bigfile-distinct.txt",splitSize);
	}
}

總結

本篇文章的內容就到這了,希望大家可以喜歡,也希望大家可以多多關注腳本之家的其他精彩內容!

相關文章

  • SpringBoot @NotBlank錯誤的解決方案

    SpringBoot @NotBlank錯誤的解決方案

    這篇文章主要介紹了SpringBoot @NotBlank錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java實現(xiàn)猜拳小游戲

    java實現(xiàn)猜拳小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 詳解java WebSocket的實現(xiàn)以及Spring WebSocket

    詳解java WebSocket的實現(xiàn)以及Spring WebSocket

    這篇文章主要介紹了詳解java WebSocket的實現(xiàn)以及Spring WebSocket ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java的四種引用方式

    Java的四種引用方式

    這篇文章主要介紹了Java的四種引用方式,Java的引用方式主要包括強引用、軟引用、弱引用、虛引用;下面文章便來詳細介紹這四種引用方式,需要的朋友可以參考一下
    2021-10-10
  • eclipse配置javap命令的方法

    eclipse配置javap命令的方法

    本篇文章主要介紹了如何為eclipse配置javap命令,在配置過程中會出現(xiàn)的小問題的解決方法,非常實用,需要的朋友可以參考下
    2015-07-07
  • springmvc學習筆記-返回json的日期格式問題的解決方法

    springmvc學習筆記-返回json的日期格式問題的解決方法

    本篇文章主要介紹了springmvc學習筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。
    2017-01-01
  • Idea如何使用Fast Request接口調試

    Idea如何使用Fast Request接口調試

    這篇文章主要介紹了Idea如何使用Fast Request接口調試問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 帶你了解Java數據結構和算法之前綴,中綴和后綴表達式

    帶你了解Java數據結構和算法之前綴,中綴和后綴表達式

    這篇文章主要為大家介紹了Java的前綴,中綴和后綴表達式 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java常用數據流全面大梳理

    Java常用數據流全面大梳理

    計算機程序中,獲取數據的方式有多種,比如:程序中直接給出、鍵盤輸入、從數據文件中讀取、從數據庫中讀取、通過網絡讀取等。為了更有效地進行數據的輸入/輸出操作,Java將各種數據源的數據,抽象為“數據流”,及stream
    2021-10-10
  • Java 生成隨機驗證碼圖片的示例

    Java 生成隨機驗證碼圖片的示例

    這篇文章主要介紹了Java 生成隨機驗證碼圖片的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10

最新評論

蓬溪县| 泰顺县| 商都县| 垫江县| 博罗县| 福安市| 德令哈市| 湟中县| 巴林左旗| 三穗县| 东方市| 金华市| 锡林浩特市| 岳阳市| 峡江县| 社会| 沾化县| 尼木县| 临朐县| 元谋县| 宝应县| 孟津县| 白朗县| 翼城县| 云梦县| 涪陵区| 柳州市| 沈丘县| 依兰县| 明溪县| 定南县| 安康市| 榆林市| 桃源县| 嘉荫县| 方城县| 侯马市| 双流县| 吐鲁番市| 万州区| 车致|