impor java.io.BufferedReader;
impor java.io.BufferedWriter;
impor java.io.FileNotFoundException;
impor java.io.FileReader;
impor java.io.FileWriter;
impor java.io.IOException;
impor java.util.Koleksi;
impor java.util.Iterator;
impor java.util.LinkedList;
import java.util.Acak;
kelas publik LargeMappedFiles {
/**
* Penyortiran dan penggabungan data besar
*
* @param argumen
*/
public static void main(String[] args) melempar IOException {
//Jalur untuk menulis file
String filePath = "D://456";
// Jalur untuk membagi file
String sqlitFilePath = "D://456//123";
//Jumlah data
int AngkaHitungan=10000000;
//Jumlah sub-file
int HitungFile=10;
//Presisi
int countAccuracy=30*HitunganFile;
long startNumber=Sistem.currentTimeMillis();
//Tulis file data besar
WriteData(filePath,CountNumbers);
System.out.println("Penyimpanan selesai");
// Bagi file data besar menjadi sepuluh file kecil lainnya
sqlitFileDate(filePath, sqlitFilePath,CountFile);
System.out.println("Pemotongan file selesai!");
// Urutkan data setiap file
singleFileDataSort(sqlitFilePath,CountFile);
System.out.println("Setiap sub-file diurutkan!");
//Penyesuaian akurasi, perbandingan dan integrasi sepuluh file data
deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
System.out.println("Integrasi selesai");
long stopNumber=Sistem.currentTimeMillis();
System.out.println("Memakan waktu"+(stopNumber-startNumber)/1000+"milidetik");
}
//Tulis file data besar
public static void WriteData(String path,int CountNumbers) melempar IOException {
jalur = jalur + "//12114.txt";
FileWriter fs = FileWriter baru(jalur);
BufferedWriter fw=BufferedWriter baru(fs);
untuk (int i = 0; i < Angka Hitung; i++) {
fw.write(new Random().nextInt(Integer.MAX_VALUE) + "/r/n");
}
fw.close();
fs.close();
}
// Bagi file data besar menjadi sepuluh file kecil lainnya
public static void sqlitFileDate(String filepath, String sqlitPath,
int CountFile) menampilkan IOException {
Penulis File fs = nol;
BufferedWriter fw=null;
FileReader fr = FileReader baru(jalur file + "//12114.txt");
BufferedReader br = new BufferedReader(fr); // Membaca dan mengambil seluruh baris data
ke dalam saya = 1;
LinkedList WriterLists=new LinkedList(); //Inisialisasi kumpulan objek aliran file
LinkedList fwLists=LinkedList baru();
untuk (int j = 1; j <= Hitung File; j++) {
//Deklarasikan objek
fs = FileWriter baru(sqlitPath + "//12" + j + ".txt",false);
fw=BufferedWriter baru(fs);
//Muat objek ke dalam koleksi
WriterLists.add(fs);
fwLists.tambahkan(fw);
}
//Tentukan apakah masih ada data yang akan dikembalikan dalam aliran file
while (br.siap()) {
int count=1;//Inisialisasi aliran file pertama
untuk (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
Tipe BufferedWriter = (BufferedWriter) iterator.next();
if(i==count)//Tentukan aliran file mana yang menjadi giliran untuk menulis data
{
//Tulis data, lompat keluar, lanjutkan ke aliran file berikutnya, dan tulis data berikutnya
mengetik.menulis(br.readLine() + "/r/n");
merusak;
}
hitungan++;
}
//Tentukan apakah aliran file terakhir telah tercapai
jika (i >= Hitung File) {
saya = 1;
} kalau tidak
saya++;
}
br.close();
fr.close();
untuk (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
Objek BufferedWriter = (BufferedWriter) iterator.next();
objek.dekat();
}
//Melintasi dan menutup semua aliran sub-file
untuk (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
Objek FileWriter = (FileWriter) iterator.next();
objek.dekat();
}
}
// Urutkan data setiap file
public static void singleFileDataSort(String path1,int CountFile) melempar IOException {
Nomor LinkedList = null;
untuk (int i = 1; i <= CountFile; i++) {
angka = LinkedList baru();
Jalur string = jalur1 + "//12" + i + ".txt";
mencoba {
FileReader fr = FileReader baru(jalur);
BufferedReader br = BufferedReader baru(fr);
while (br.siap()) {
// Tambahkan data tunggal yang sudah dibaca ke koleksi
nums.add(Integer.parseInt(br.readLine()));
}
// Urutkan koleksinya
Koleksi.sort(angka);
//Tulis data yang diurutkan ke dalam file sumber
numberSort(angka, jalur);
br.close();
fr.close();
} tangkapan (NumberFormatException e) {
e.printStackTrace();
} tangkapan (FileNotFoundException e) {
e.printStackTrace();
} tangkapan (IOException e) {
e.printStackTrace();
}
}
}
// Urutkan setiap data file lalu tulis ke file sumber
public static void numberSort(Daftar LinkedList, jalur String) {
mencoba {
FileWriter fs = FileWriter baru(jalur);
BufferedWriter fw=BufferedWriter baru(fs);
untuk (Iterator iterator = daftar.iterator(); iterator.hasNext();) {
Objek objek = (Objek) iterator.next();
fw.write(objek + "/r/n");
}
fw.close();
fs.close();
} tangkapan (IOException e) {
e.printStackTrace();
}
}
//Integrasi akhir data file (penyesuaian akurasi)
public static void deathDataFile(String filepath, String sqlitFilePath1,
int countAccuracy, int CountFile) menampilkan IOException {
LinkedList nums = new LinkedList(); //Tambahkan data dan urutkan
Object temp = null; // Catat nomor terakhir yang tersisa di setiap pengurutan
boolean ispass = salah;
LinkedList ispasses = null; //Rekam informasi status file data
FileWriter fs = new FileWriter(filepath + "//Sort.txt", false); //Membuat aliran file untuk penulisan data terintegrasi
BufferedWriter bw=BufferedWriter baru(fs);
FileReader fr = null; //Deklarasikan pembacaan aliran file
BufferedReader br = null; //Deklarasikan BufferedReader
LinkedList WriterLists = new LinkedList(); // Inisialisasi kumpulan objek aliran file
LinkedList WriterListFile = LinkedList baru();
untuk (int j = 1; j <= Hitung File; j++) {
// Deklarasikan objek dan buka semua aliran sub-file untuk mengakses data semua sub-file
fr = FileReader baru(sqlitFilePath1 + "//12" + j + ".txt");
//Buka semua BufferedReaders untuk memfasilitasi pembacaan seluruh baris di lain waktu
br = BufferedReader baru(fr);
//Muat semua objek FileReader ke dalam koleksi
WriterListFile.add(fr);
//Muat semua objek BufferedReader ke dalam koleksi
WriterLists.add(br);
}
untuk (;;) {
// Simpan status data dari sepuluh file sumber ke dalam koleksi untuk memudahkan penilaian selanjutnya.
ispass = new LinkedList();
// Membaca data individual dari sepuluh file sumber masing-masing
untuk (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
Objek BufferedReader = (BufferedReader) iterator.next();
Objek objek = null;
while (objek.siap()) {
//Tambahkan data untuk setiap aliran file
nums.add(Integer.parseInt(object.readLine().toString()));
merusak;
}
if (objek.siap() == salah)
ispasses.add("true"); //Simpan status data di setiap file ke dalam koleksi
}
// Tentukan apakah ini pertama kalinya masuk
if (nums.size() % countAccuracy == 0 && ispass == false) {
// Urutkan koleksinya
Koleksi.sort(angka);
//Terima data terbesar, dan tulis data lainnya ke file pengurutan total
temp = numberSortData(nums, jalur file, false, countAccuracy, bw);
//Inisialisasi ulang koleksi
angka = LinkedList baru();
//Tambahkan sisa data dari kumpulan perbandingan sebelumnya
angka.tambahkan(temp);
ispass = benar;
//Catat jumlah data file sumber untuk traversal berikutnya
melanjutkan;
}
jika (lewatkan) {
if (angka.ukuran() % countAccuracy == 1 && angka.ukuran() > 1) {
// Urutkan koleksinya
Koleksi.sort(angka);
//Terima data terbesar, dan tulis data lainnya ke file pengurutan total
temp = numberSortData(angka, jalur file, true, countAccuracy,
bw);
angka = LinkedList baru();
angka.tambahkan(temp);
melanjutkan;
}
}
//Rekam lokasi kumpulan data berikutnya
// Tentukan apakah kesepuluh file tidak memiliki data
if (ispasses.size() == Hitung File) {
Koleksi.sort(angka);
temp = numberSortData(nums, jalur file, true, countAccuracy, bw);
angka = LinkedList baru();
merusak;
}
}
bw.close();
//Tutup aliran tulis
fs.close();
//Tutup semua BufferedReader
untuk (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
objek2.tutup();
}
//Tutup semua FileReader
untuk (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {
Objek FileReader = (FileReader) iterator.next();
objek.dekat();
}
}
// Urutkan data dan tuliskan ke dalam file akhir (penyesuaian presisi)
Nomor Objek statis publikSortData(Daftar LinkedList, String filePath,
boolean ispass, int countAccuracy,BufferedWriter fs) {
Suhu objek = 0; //Rekam nilai terakhir
int tempCount = 0; //Rekam lokasi data tertulis
mencoba {
untuk (Iterator iterator = daftar.iterator(); iterator.hasNext();) {
Objek objek = (Objek) iterator.next();
// Tentukan apakah itu angka terakhir
if (tempCount == daftar.ukuran() - 1) {
// Penilaian bahwa ada kurang dari 100 di set
if (daftar.ukuran() < countAccuracy + 1 && ispass) {
suhu = nol;
} kalau tidak {
suhu = objek;
merusak;
}
}
//Menulis ke sumber data
fs.write(objek + "/r/n");
//Subskrip dari data yang direkam
tempCount++;
}
} tangkapan (IOException e) {
e.printStackTrace();
}
suhu kembali;
}
}