我正在将一个10 GB的文件拆分成100000 +几百个单词的多个文件(因为当我遇到100000个单词时,我读到了该行)。
private void splitInputFile(String path) {
try{
File file=new File(path);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String temp;
temp = br.readLine();
String fileName="fileName";
int fileCount = 1;
while(temp!=null){
//TODO Read 100000 words, sort and write to a file. Repeat for the entire file
if(wordsToBeSorted.size()<=100000){
startCounting(temp);
temp=br.readLine();
}//end of if -> place 100000+ words inside the list
else{
Collections.sort(wordsToBeSorted);
fileName = "fileName"+fileCount;
fileCount++;
File splitFile = new File(fileName);
PrintWriter pr = new PrintWriter(splitFile);
for(String word:wordsToBeSorted){
pr.write(word);
pr.write("\n");//check if this works -> 1 word per line
}//end of for
}//end of else
}//end of while
mergeSort(fileCount);
}//end of try
catch(Exception e){
e.printStackTrace();
}
}
private void startCounting(String sb) {
StringTokenizer tokenizer = new StringTokenizer(sb);// Split by space
while (tokenizer.hasMoreTokens()) {
String text = tokenizer.nextToken();
text = text.replaceAll("\\W", "");// Remove all symbols
if("".equals(text.trim()))
continue;
wordsToBeSorted.add(text);
}
}
现在我想知道如何使用这些文件进行排序。我发现我应该做一个合并排序。考虑到每个splitFile具有可变数量的单词(100000 +几个额外单词)的事实,是否可以进行涉及可变单词计数的文件的合并排序?或者我应该采用其他方法来拆分文件吗?
答案 0 :(得分:1)
是否可以进行涉及可变字数统计的合并排序?
不确定。我假设这里的目标是external sorting。只需打开所有输入文件(除非有真的很多,在这种情况下你可能需要多次运行),从每个文件中读取第一个单词。然后用最小的单词识别输入,将其放入输出并从该输入读取下一个单词。关闭并删除任何变为空的输入,除非您没有更多输入。
如果您有许多输入,则可以使用heap来组织输入,并将下一个单词作为键。您将删除最小对象,然后在继续下一个单词后重新插入它。