教新手使用java如何对一个大的文本文件内容进行去重

网友投稿 234 2023-01-04

教新手使用java如何对一个大的文本文件内容进行去重

目录有内存溢出风险的写法:通过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;

NIodsAWFy Set allHash = null;

FileReader fr = null;

BufferedReader br = null;

try {

pw = new PrintWriter(distinctedFile);

allHash = new HashSet();

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

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

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 unicSet = new HashSet();

for(int i=0;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

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);

}

}

总结

本篇文章的内容就到这了,希望大家可以喜欢,也希望大家可以多多关注我们的其他精彩内容!

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

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 unicSet = new HashSet();

for(int i=0;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

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);

}

}

总结

本篇文章的内容就到这了,希望大家可以喜欢,也希望大家可以多多关注我们的其他精彩内容!

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 unicSet = new HashSet();

for(int i=0;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

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);

}

}

总结

本篇文章的内容就到这了,希望大家可以喜欢,也希望大家可以多多关注我们的其他精彩内容!

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

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);

}

}

总结

本篇文章的内容就到这了,希望大家可以喜欢,也希望大家可以多多关注我们的其他精彩内容!

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);

}

}

总结

本篇文章的内容就到这了,希望大家可以喜欢,也希望大家可以多多关注我们的其他精彩内容!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深圳中通快递物流查询单号(深圳中通快递物流查询单号查询官网)
下一篇:浏览器抓取网站api接口(浏览器抓取网站api接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~