gpt4 book ai didi

java - 读取并匹配两个大文件的内容

转载 作者:行者123 更新时间:2023-11-30 07:36:20 26 4
gpt4 key购买 nike

我有两个文件,每个文件具有相同的格式,大约有 100,000 行。对于第一个文件中的每一行,我提取第二个组件或列,如果我在第二个文件的第二列中找到匹配项,我会提取它们的第三个组件并将它们组合、存储或输出。

虽然我的实现有效,但程序运行速度非常慢,迭代文件、比较并输出所有结果需要一个多小时。

我正在读取两个文件的数据并将其存储在 ArrayList 中,然后迭代这些列表并进行比较。下面是我的代码,是否存在任何与性能相关的故障,或者对于此类操作来说是正常的。

注意:我使用的是 String.split() 但我从其他帖子中了解到 StringTokenizer 更快。

public ArrayList<String> match(String file1, String file2) throws IOException{
ArrayList<String> finalOut = new ArrayList<>();
try {
ArrayList<String> data = readGenreDataIntoMemory(file1);
ArrayList<String> data1 = readGenreDataIntoMemory(file2);
StringTokenizer st = null;

for(String line : data){
HashSet<String> genres = new HashSet<>();
boolean sameMovie = false;
String movie2 = "";
st = new StringTokenizer(line, "|");
//String line[] = fline.split("\\|");
String ratingInfo = st.nextToken();
String movie1 = st.nextToken();
String genreInfo = st.nextToken();
if(!genreInfo.equals("null")){
for(String s : genreInfo.split(",")){
genres.add(s);
}
}


StringTokenizer st1 = null;
for(String line1 : data1){
st1 = new StringTokenizer(line1, "|");
st1.nextToken();
movie2 = st1.nextToken();
String genreInfo2= st1.nextToken();
//If the movie name are similar then they should have the same genre
//Update their genres to be the same
if(!genreInfo2.equals("null") && movie1.equals(movie2)){
for(String s : genreInfo2.split(",")){
genres.add(s);
}
sameMovie = true;
break;
}
}
if(sameMovie){
finalOut.add(ratingInfo+""+movieName+""+genres.toString()+"\n");
}else if(sameMovie == false){
finalOut.add(line);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return finalOut;
}

最佳答案

我会使用 Streams API

String file1 = "files1.txt";
String file2 = "files2.txt";
// get all the lines by movie name for each file.
Map<String, List<String[]>> map = Stream.of(Files.lines(Paths.get(file1)),
Files.lines(Paths.get(file2)))
.flatMap(p -> p)
.parallel()
.map(s -> s.split("[|]", 3))
.collect(Collectors.groupingByConcurrent(sa -> sa[1], Collectors.toList()));

// merge all the genres for each movie.
map.forEach((movie, lines) -> {
Set<String> genres = lines.stream()
.flatMap(l -> Stream.of(l[2].split(",")))
.collect(Collectors.toSet());
System.out.println("movie: " + movie + " genres: " + genres);
});

它的优点是 O(n) 而不是 O(n^2) 并且它是多线程的。

关于java - 读取并匹配两个大文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com