import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
java.util.LinkedList 가져오기;
import java.util.Random;
공개 클래스 LargeMappedFiles {
/**
* 빅데이터 정렬 및 병합
*
* @param 인수
*/
public static void main(String[] args)에서 IOException이 발생합니다.
//파일을 쓸 경로
문자열 파일 경로 = "D://456";
//분할 파일 경로
문자열 sqlitFilePath = "D://456//123";
//데이터 개수
int CountNumbers=10000000;
//하위 파일 개수
int CountFile=10;
//정도
int countAccuracy=30*CountFile;
긴 startNumber=System.currentTimeMillis();
//빅데이터 파일 쓰기
WriteData(filePath,CountNumbers);
System.out.println("저장 완료");
// 빅 데이터 파일을 10개의 다른 작은 파일로 분할합니다.
sqlitFileDate(filePath, sqlitFilePath,CountFile);
System.out.println("파일 자르기 완료!");
// 각 파일의 데이터를 정렬합니다.
SingleFileDataSort(sqlitFilePath,CountFile);
System.out.println("각 하위 파일이 정렬되었습니다!");
//10개 파일 데이터의 정확도 조정, 비교, 통합
deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
System.out.println("통합 완료");
긴 stopNumber=System.currentTimeMillis();
System.out.println("시간이 많이 걸립니다"+(stopNumber-startNumber)/1000+"밀리초");
}
//빅데이터 파일 쓰기
public static void WriteData(String path,int CountNumbers)는 IOException을 발생시킵니다.
경로 = 경로 + "//12114.txt";
FileWriter fs = 새 FileWriter(경로);
BufferedWriter fw=새로운 BufferedWriter(fs);
for (int i = 0; i < CountNumbers; i++) {
fw.write(new Random().nextInt(Integer.MAX_VALUE) + "/r/n");
}
fw.close();
fs.close();
}
// 빅 데이터 파일을 10개의 다른 작은 파일로 분할합니다.
공개 정적 무효 sqlitFileDate(문자열 파일 경로, 문자열 sqlitPath,
int CountFile)은 IOException을 발생시킵니다.
FileWriter fs = null;
BufferedWriter fw=null;
FileReader fr = new FileReader(filepath + "//12114.txt");
BufferedReader br = new BufferedReader(fr); // 전체 데이터 라인을 읽고 가져옵니다.
int i = 1;
LinkedList WriterLists=new LinkedList(); //파일 스트림 객체 컬렉션 초기화
LinkedList fwLists=new LinkedList();
for (int j = 1; j <= CountFile; j++) {
//객체 선언
fs = new FileWriter(sqlitPath + "//12" + j + ".txt",false);
fw=새로운 BufferedWriter(fs);
//객체를 컬렉션에 로드
WriterLists.add(fs);
fwLists.add(fw);
}
//파일 스트림에 반환할 데이터가 아직 있는지 확인
동안 (br.ready()) {
int count=1;//첫 번째 파일 스트림 초기화
for (반복자 iterator = fwLists.iterator(); iterator.hasNext();) {
BufferedWriter 유형 = (BufferedWriter) iterator.next();
if(i==count)//데이터를 쓸 차례인 파일 스트림 결정
{
//데이터 쓰기, 점프아웃, 다음 파일 스트림으로 진행, 다음 데이터 쓰기
type.write(br.readLine() + "/r/n");
부서지다;
}
카운트++;
}
//마지막 파일 스트림에 도달했는지 확인
if (i >= CountFile) {
나는 = 1;
} 또 다른
나++;
}
br.닫기();
fr.close();
for (반복자 iterator = fwLists.iterator(); iterator.hasNext();) {
BufferedWriter 객체 = (BufferedWriter) iterator.next();
object.close();
}
//모든 하위 파일 스트림을 탐색하고 닫습니다.
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
FileWriter 객체 = (FileWriter) iterator.next();
object.close();
}
}
// 각 파일의 데이터를 정렬합니다.
public static void SingleFileDataSort(String path1,int CountFile)는 IOException을 발생시킵니다.
LinkedList 숫자 = null;
for (int i = 1; i <= CountFile; i++) {
nums = 새로운 LinkedList();
문자열 경로 = path1 + "//12" + i + ".txt";
노력하다 {
FileReader fr = new FileReader(경로);
BufferedReader br = new BufferedReader(fr);
동안 (br.ready()) {
// 읽은 단일 데이터를 컬렉션에 추가합니다.
nums.add(Integer.parseInt(br.readLine()));
}
// 컬렉션 정렬
Collections.sort(nums);
//정렬된 데이터를 소스 파일에 씁니다.
numberSort(숫자, 경로);
br.닫기();
fr.close();
} 잡기(NumberFormatException e) {
e.printStackTrace();
} 잡기(FileNotFoundException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
// 각 파일 데이터를 정렬한 후 소스 파일에 씁니다.
공개 정적 무효 numberSort(LinkedList 목록, 문자열 경로) {
노력하다 {
FileWriter fs = 새 FileWriter(경로);
BufferedWriter fw=새로운 BufferedWriter(fs);
for (반복자 iterator = list.iterator(); iterator.hasNext();) {
객체 객체 = (객체) iterator.next();
fw.write(객체 + "/r/n");
}
fw.close();
fs.close();
} 잡기(IOException e) {
e.printStackTrace();
}
}
//파일 데이터 최종 통합(정확도 조정)
공개 정적 무효 deathDataFile(문자열 파일 경로, 문자열 sqlitFilePath1,
int countAccuracy, int CountFile)은 IOException을 발생시킵니다.
LinkedList nums = new LinkedList(); //데이터 추가 및 정렬
Object temp = null; // 각 정렬에 남은 마지막 숫자를 기록합니다.
부울 ispass = false;
LinkedList ispasses = null; //데이터 파일의 상태 정보를 기록합니다.
FileWriter fs = new FileWriter(filepath + "//Sort.txt", false); //통합 데이터 쓰기를 위한 파일 스트림 생성
BufferedWriter bw=새로운 BufferedWriter(fs);
FileReader fr = null //파일 스트림 읽기 선언
BufferedReader br = null //BufferedReader 선언;
LinkedList WriterLists = new LinkedList(); // 파일 스트림 객체 컬렉션을 초기화합니다.
LinkedList WriterListFile = 새로운 LinkedList();
for (int j = 1; j <= CountFile; j++) {
// 객체를 선언하고 모든 하위 파일 스트림을 열어 모든 하위 파일의 데이터에 액세스합니다.
fr = new FileReader(sqlitFilePath1 + "//12" + j + ".txt");
//다음 번에 전체 라인을 쉽게 읽을 수 있도록 모든 BufferedReader를 엽니다.
br = 새로운 BufferedReader(fr);
//모든 FileReader 객체를 컬렉션에 로드합니다.
WriterListFile.add(fr);
//모든 BufferedReader 객체를 컬렉션에 로드합니다.
WriterLists.add(br);
}
을 위한 (;;) {
// 후속 판단을 용이하게 하기 위해 10개의 소스 파일의 데이터 상태를 컬렉션에 저장합니다.
ispasses = 새로운 LinkedList();
// 10개의 소스 파일에서 각각 개별 데이터를 읽습니다.
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader 객체 = (BufferedReader) iterator.next();
객체 obj = null;
동안(object.ready()) {
//각 파일 스트림에 대한 데이터 추가
nums.add(Integer.parseInt(object.readLine().toString()));
부서지다;
}
if (object.ready() == false)
ispasses.add("true"); //각 파일의 데이터 상태를 컬렉션에 저장합니다.
}
// 처음 들어오는지 여부를 판단
if (nums.size() % countAccuracy == 0 && ispass == false) {
// 컬렉션 정렬
Collections.sort(nums);
//가장 큰 데이터를 수신하고 다른 데이터를 전체 정렬 파일에 씁니다.
temp = numberSortData(nums, filepath, false, countAccuracy, bw);
//컬렉션을 다시 초기화합니다.
nums = 새로운 LinkedList();
//이전 비교 세트의 나머지 데이터를 추가합니다.
숫자.추가(임시);
ispass = 사실;
//다음 순회를 위해 소스 파일의 데이터 양을 기록합니다.
계속하다;
}
if (통과) {
if (nums.size() % countAccuracy == 1 && nums.size() > 1) {
// 컬렉션 정렬
Collections.sort(nums);
//가장 큰 데이터를 수신하고 다른 데이터를 전체 정렬 파일에 씁니다.
temp = numberSortData(nums, filepath, true, countAccuracy,
bw);
nums = 새로운 LinkedList();
숫자.추가(임시);
계속하다;
}
}
//다음 데이터 세트의 위치를 기록합니다.
// 10개 파일 모두 데이터가 없는지 확인
if (ispasses.size() == CountFile) {
Collections.sort(nums);
temp = numberSortData(nums, filepath, true, countAccuracy, bw);
nums = 새로운 LinkedList();
부서지다;
}
}
bw.close();
//쓰기 스트림을 닫습니다.
fs.close();
//모든 BufferedReader를 닫습니다.
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
object2.close();
}
//모든 FileReader를 닫습니다.
for (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {
FileReader 객체 = (FileReader) iterator.next();
object.close();
}
}
// 데이터를 정렬하여 최종 파일에 쓴다(정밀도 조정)
공개 정적 개체 번호SortData(LinkedList 목록, 문자열 파일 경로,
부울 ispass, int countAccuracy,BufferedWriter fs) {
개체 온도 = 0; //마지막 값을 기록합니다.
int tempCount = 0; //기록된 데이터 위치를 기록합니다.
노력하다 {
for (반복자 iterator = list.iterator(); iterator.hasNext();) {
객체 객체 = (객체) iterator.next();
// 마지막 숫자인지 확인
if (tempCount == list.size() - 1) {
// 집합이 100개 미만이라고 판단
if (list.size() < countAccuracy + 1 && ispass) {
온도 = null;
} 또 다른 {
온도 = 개체;
부서지다;
}
}
//데이터 소스에 쓰기
fs.write(객체 + "/r/n");
//녹화된 데이터의 첨자
온도카운트++;
}
} 잡기(IOException e) {
e.printStackTrace();
}
복귀온도;
}
}