import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
استيراد java.io.FileReader؛
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;
فئة عامة LargeMappedFiles {
/**
* فرز البيانات الكبيرة ودمجها
*
* @param args
*/
public static void main(String[] args) يلقي IOException {
// مسار كتابة الملف
سلسلة ملف المسار = "D://456";
// مسار تقسيم الملف
String sqlitFilePath = "D://456//123";
// عدد البيانات
int CountNumbers=10000000;
// عدد الملفات الفرعية
int CountFile=10;
//دقة
int countAccuracy=30*CountFile;
long startNumber=System.currentTimeMillis();
//اكتب ملف بيانات كبير
WriteData(filePath,CountNumbers);
System.out.println("اكتمل التخزين");
// قم بتقسيم ملف البيانات الضخمة إلى عشرة ملفات صغيرة أخرى
sqlitFileDate(filePath, sqlitFilePath,CountFile);
System.out.println("اكتمل قطع الملف!");
// فرز بيانات كل ملف
SingleFileDataSort(sqlitFilePath,CountFile);
System.out.println("يتم فرز كل ملف فرعي!");
// تعديل الدقة والمقارنة والتكامل بين بيانات الملفات العشرة
DeathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
System.out.println("اكتمل التكامل");
long stopNumber=System.currentTimeMillis();
System.out.println("استهلاك الوقت"+(stopNumber-startNumber)/1000+"ميلي ثانية");
}
//اكتب ملف بيانات كبير
كتابة البيانات الثابتة العامة (مسار السلسلة، عدد int CountNumbers) يلقي IOException {
المسار = المسار + "//12114.txt";
FileWriter fs = new FileWriter(path);
BufferedWriter fw=new BufferedWriter(fs);
لـ (int i = 0; i < CountNumbers; i++) {
fw.write(new Random().nextInt(Integer.MAX_VALUE) + "/r/n");
}
fw. Close();
fs. Close();
}
// قم بتقسيم ملف البيانات الضخمة إلى عشرة ملفات صغيرة أخرى
sqlitFileDate باطلة عامة ثابتة (مسار ملف السلسلة، سلسلة sqlitPath،
int CountFile) يلقي IOException {
FileWriter fs = null;
BufferedWriter fw=null;
FileReader fr = new FileReader(filepath + "//12114.txt");
BufferedReader br = new BufferedReader(fr); // اقرأ واحصل على سطر البيانات بالكامل
كثافة العمليات ط = 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=new BufferedWriter(fs);
// قم بتحميل الكائن إلى المجموعة
WriterLists.add(fs);
fwLists.add(fw);
}
// تحديد ما إذا كانت لا تزال هناك بيانات يمكن إرجاعها في دفق الملف
بينما (br.ready()) {
int count=1;// تهيئة دفق الملف الأول
for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
نوع BufferedWriter = (BufferedWriter) iterator.next();
if(i==count)// حدد دفق الملف الذي سيحين دوره لكتابة البيانات
{
// اكتب البيانات، واقفز للخارج، وانتقل إلى دفق الملف التالي، واكتب البيانات التالية
type.write(br.readLine() + "/r/n");
استراحة؛
}
العد++;
}
// تحديد ما إذا كان قد تم الوصول إلى دفق الملف الأخير
إذا (i >= CountFile) {
أنا = 1؛
} آخر
أنا++;
}
br. Close();
fr.Close();
for (Iterator iterator = fwLists.iterator(); iterator.hasNext();) {
كائن BufferedWriter = (BufferedWriter) iterator.next();
كائن. إغلاق ()؛
}
// اجتياز وإغلاق جميع تدفقات الملفات الفرعية
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
كائن FileWriter = (FileWriter) iterator.next();
كائن. إغلاق ()؛
}
}
// فرز بيانات كل ملف
public static void SingleFileDataSort(String path1,int CountFile) يلقي IOException {
LinkedList nums = null;
for (int i = 1; i <= CountFile; i++) {
nums = new LinkedList();
مسار السلسلة = path1 + "//12" + i + ".txt"؛
يحاول {
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
بينما (br.ready()) {
// أضف البيانات الفردية المقروءة إلى المجموعة
nums.add(Integer.parseInt(br.readLine()));
}
// فرز المجموعة
Collections.sort(nums);
// اكتب البيانات التي تم فرزها في الملف المصدر
numberSort(nums, path);
br. Close();
fr.Close();
} التقاط (NumberFormatException e) {
printStackTrace();
} قبض على (FileNotFoundException ه) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
}
}
}
// قم بفرز بيانات كل ملف ثم كتابتها في الملف المصدر
رقم الفراغ الثابت العام (قائمة LinkedList، مسار السلسلة) {
يحاول {
FileWriter fs = new FileWriter(path);
BufferedWriter fw=new BufferedWriter(fs);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
كائن الكائن = (كائن) iterator.next();
fw.write(object + "/r/n");
}
fw. Close();
fs. Close();
} قبض (IOException ه) {
printStackTrace();
}
}
// التكامل النهائي لبيانات الملف (تعديل الدقة)
ملف DeathDataFile العام الثابت (مسار ملف السلسلة، سلسلة sqlitFilePath1،
int countAccuracy، int CountFile) يلقي IOException {
LinkedList nums = new LinkedList(); // إضافة البيانات وفرزها
Object temp = null; // سجل آخر رقم متبقي في كل عملية فرز
تمرير منطقي = خطأ؛
LinkedList ispasses = null; // سجل معلومات الحالة لملف البيانات
FileWriter fs = new FileWriter(filepath + "//Sort.txt"، false)؛ // إنشاء دفق ملف لكتابة البيانات المتكاملة
BufferedWriter bw=new BufferedWriter(fs);
FileReader fr = null; // أعلن عن قراءة دفق الملف
BufferedReader br = null;
LinkedList WriterLists = new LinkedList(); // تهيئة مجموعة كائنات دفق الملف
LinkedList WriterListFile = new LinkedList();
for (int j = 1; j <= CountFile; j++) {
// قم بتعريف الكائن وافتح جميع تدفقات الملفات الفرعية للوصول إلى بيانات جميع الملفات الفرعية
fr = new FileReader(sqlitFilePath1 + "//12" + j + ".txt");
// افتح جميع BufferedReaders لتسهيل قراءة السطر بأكمله في المرة القادمة
br = new BufferedReader(fr);
// قم بتحميل كافة كائنات FileReader إلى المجموعة
WriterListFile.add(fr);
// قم بتحميل كافة كائنات BufferedReader إلى المجموعة
WriterLists.add(br);
}
ل (؛؛) {
// قم بتخزين حالة بيانات الملفات المصدر العشرة في مجموعة لتسهيل الحكم اللاحق.
ispasses = new LinkedList();
// قراءة البيانات الفردية من عشرة ملفات مصدر على التوالي
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
كائن BufferedReader = (BufferedReader) iterator.next();
Object obj = null;
بينما (object.ready()) {
// أضف بيانات لكل دفق ملف
nums.add(Integer.parseInt(object.readLine().toString()));
استراحة؛
}
إذا (object.ready() == خطأ)
ispasses.add("true"); // احفظ حالة البيانات في كل ملف في المجموعة
}
// تحديد ما إذا كانت هذه هي المرة الأولى التي تدخل فيها
إذا (nums.size() % countAccuracy == 0 && ispass == false) {
// فرز المجموعة
Collections.sort(nums);
// احصل على أكبر البيانات واكتب البيانات الأخرى في ملف الفرز الإجمالي
temp = numberSortData(nums, filepath, false, countAccuracy, bw);
// إعادة تهيئة المجموعة
nums = new LinkedList();
// أضف البيانات المتبقية من مجموعة المقارنات السابقة
nums.add(temp);
إباس = صحيح؛
// سجل كمية بيانات الملف المصدر للاجتياز التالي
يكمل؛
}
إذا (إيباس) {
إذا (nums.size() % countAccuracy == 1 && nums.size() > 1) {
// فرز المجموعة
Collections.sort(nums);
// احصل على أكبر البيانات واكتب البيانات الأخرى في ملف الفرز الإجمالي
درجة الحرارة = numberSortData(nums, filepath, true, countAccuracy,
وزن الجسم)؛
nums = new LinkedList();
nums.add(temp);
يكمل؛
}
}
// سجل موقع مجموعة البيانات التالية
// تحديد ما إذا كانت جميع الملفات العشرة لا تحتوي على بيانات
إذا (ispasses.size() == CountFile) {
Collections.sort(nums);
temp = numberSortData(nums, filepath, true, countAccuracy, bw);
nums = new LinkedList();
استراحة؛
}
}
bw. Close();
// أغلق دفق الكتابة
fs. Close();
// أغلق جميع BufferedReaders
for (Iterator iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
object2.Close();
}
// أغلق جميع قارئي الملفات
for (Iterator iterator = WriterListFile.iterator(); iterator.hasNext();) {
كائن قارئ الملفات = (قارئ الملفات) iterator.next();
كائن. إغلاق ()؛
}
}
// فرز البيانات وكتابتها في الملف النهائي (ضبط الدقة)
رقم الكائن الثابت العام، SortData (قائمة LinkedList، String filePath،
تمرير منطقي، int countAccuracy،BufferedWriter fs) {
درجة حرارة الكائن = 0; // سجل القيمة الأخيرة
int tempCount = 0; // سجل موقع البيانات المكتوبة
يحاول {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
كائن الكائن = (كائن) iterator.next();
// تحديد ما إذا كان هذا هو الرقم الأخير
إذا (tempCount == list.size() - 1) {
// الحكم بأن هناك أقل من 100 في المجموعة
إذا (list.size() <countAccuracy + 1 && ispass) {
درجة الحرارة = فارغة؛
} آخر {
درجة الحرارة = كائن؛
استراحة؛
}
}
// الكتابة إلى مصدر البيانات
fs.write(object + "/r/n");
// منخفض البيانات المسجلة
tempCount++;
}
} قبض (IOException ه) {
printStackTrace();
}
درجة حرارة العودة؛
}
}