java.io.BufferedReaderをインポートします。
インポート java.io.BufferedWriter;
インポートjava.io.FileNotFoundException;
java.io.FileReaderをインポートします。
java.io.FileWriterをインポートします。
インポート java.io.IOException;
java.util.Collectionsをインポートします。
java.util.Iteratorをインポートします。
java.util.LinkedListをインポートします。
java.util.Randomをインポートします。
パブリック クラス LargeMappedFiles {
/**
* ビッグデータの並べ替えと結合
*
* @param 引数
*/
public static void main(String[] args) throws IOException {
//書き込みファイルのパス
文字列ファイルパス = "D://456";
// 分割ファイルへのパス
文字列sqlitFilePath = "D://456//123";
//データ数
int CountNumbers=10000000;
// サブファイルの数
int CountFile=10;
//精度
int countAccuracy=30*CountFile;
long 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) throws IOException {
パス = パス + "//12114.txt";
FileWriter fs = 新しい FileWriter(パス);
BufferedWriter fw=new BufferedWriter(fs);
for (int i = 0; i < CountNumbers; i++) {
fw.write(new Random().nextInt(Integer.MAX_VALUE) + "/r/n");
}
fw.close();
fs.close();
}
// 大きなデータ ファイルを 10 個の小さなファイルに分割します
public static void sqlitFileDate(String ファイルパス, String sqlitPath,
int CountFile) が IOException をスローする {
FileWriter fs = null;
BufferedWriter fw=null;
FileReader fr = new FileReader(ファイルパス + "//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);
}
// ファイル ストリームに返すデータがまだあるかどうかを判断します
while (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) {
i = 1;
} それ以外
i++;
}
br.close();
fr.close();
for (イテレータ iterator = fwLists.iterator(); iterator.hasNext();) {
BufferedWriter オブジェクト = (BufferedWriter) iterator.next();
object.close();
}
//すべてのサブファイル ストリームをトラバースして閉じます
for (イテレータ iterator = WriterLists.iterator(); iterator.hasNext();) {
FileWriter オブジェクト = (FileWriter) iterator.next();
object.close();
}
}
// 各ファイルのデータをソートします
public static void singleFileDataSort(String path1,int CountFile) throws IOException {
LinkedList の数値 = null;
for (int i = 1; i <= CountFile; i++) {
nums = 新しい LinkedList();
文字列パス = path1 + "//12" + i + ".txt";
試す {
FileReader fr = 新しい FileReader(パス);
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
// 読み取った単一データをコレクションに追加します
nums.add(Integer.parseInt(br.readLine()));
}
// コレクションを並べ替える
Collections.sort(nums);
//ソートしたデータをソースファイルに書き込みます
数値ソート(数値, パス);
br.close();
fr.close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}
// 各ファイルのデータをソートしてソースファイルに書き込みます
public static void numberSort(LinkedList リスト、文字列パス) {
試す {
FileWriter fs = 新しい FileWriter(パス);
BufferedWriter fw=new BufferedWriter(fs);
for (イテレータ iterator = list.iterator(); iterator.hasNext();) {
オブジェクト object = (オブジェクト) iterator.next();
fw.write(オブジェクト + "/r/n");
}
fw.close();
fs.close();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
//ファイルデータの最終統合(精度調整)
public static void deathDataFile(String filepath, String sqlitFilePath1,
int countAccuracy, int CountFile) throws IOException {
LinkedList nums = new LinkedList() // データを追加して並べ替えます。
Object temp = null // 各ソートで残った最後の番号を記録します。
ブール値 ispass = false;
LinkedList ispasses = null //データファイルのステータス情報を記録します。
FileWriter fs = new FileWriter(filepath + "//Sort.txt", false); //統合データ書き込み用のファイル ストリームを作成します。
BufferedWriter bw=new BufferedWriter(fs);
FileReader fr = null //ファイルストリームの読み取りを宣言します。
BufferedReader br = null //BufferedReader を宣言します。
LinkedList WriterLists = new LinkedList() // ファイル ストリーム オブジェクト コレクションを初期化します。
LinkedList WriterListFile = new LinkedList();
for (int j = 1; j <= CountFile; j++) {
// オブジェクトを宣言し、すべてのサブファイル ストリームを開いてすべてのサブファイルのデータにアクセスします
fr = new FileReader(sqlitFilePath1 + "//12" + j + ".txt");
//次回の行全体の読み取りを容易にするために、すべての BufferedReaders を開きます
br = 新しい BufferedReader(fr);
//すべての FileReader オブジェクトをコレクションにロードします
WriterListFile.add(fr);
//すべての BufferedReader オブジェクトをコレクションにロードします
WriterLists.add(br);
}
のために (;;) {
// 後の判断を容易にするために、10 個のソース ファイルのデータ状態をコレクションに保存します。
ispasses = 新しい LinkedList();
// 10 個のソース ファイルからそれぞれ個別のデータを読み取ります
for (イテレータ iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader オブジェクト = (BufferedReader) iterator.next();
オブジェクトobj = null;
while (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();
//前の比較セットからの残りのデータを追加します
nums.add(一時);
ispass = true;
//次の走査のためにソースファイルのデータ量を記録します
続く;
}
if (ispass) {
if (nums.size() % countAccuracy == 1 && nums.size() > 1) {
// コレクションを並べ替える
Collections.sort(nums);
//最大のデータを受信し、他のデータを合計ソート ファイルに書き込みます
temp = numberSortData(nums, ファイルパス, true, countAccuracy,
bw);
nums = 新しい LinkedList();
nums.add(一時);
続く;
}
}
// 次のデータセットの場所を記録します
// 10 個のファイルすべてにデータがないかどうかを判断します
if (ispasses.size() == CountFile) {
Collections.sort(nums);
temp = numberSortData(nums, filepath, true, countAccuracy, bw);
nums = 新しい LinkedList();
壊す;
}
}
bw.close();
//書き込みストリームを閉じる
fs.close();
// すべての BufferedReader を閉じる
for (イテレータ iterator = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
object2.close();
}
//すべての FileReader を閉じる
for (イテレータ iterator = WriterListFile.iterator(); iterator.hasNext();) {
FileReader オブジェクト = (FileReader) iterator.next();
object.close();
}
}
// データをソートして最終ファイルに書き込む(精度調整)
public static オブジェクト番号SortData(LinkedListリスト, String filePath,
boolean ispass、int countAccuracy、BufferedWriter fs) {
Object temp = 0 //最後の値を記録します。
int tempCount = 0; //書き込まれたデータの場所を記録します。
試す {
for (イテレータ iterator = list.iterator(); iterator.hasNext();) {
オブジェクト object = (オブジェクト) iterator.next();
// 最後の番号かどうかを判断します
if (tempCount == list.size() - 1) {
// セット内に100個未満があると判断
if (list.size() < countAccuracy + 1 && ispass) {
一時 = null;
} それ以外 {
一時 = オブジェクト;
壊す;
}
}
//データソースへの書き込み
fs.write(オブジェクト + "/r/n");
//記録データの添字
tempCount++;
}
} キャッチ (IOException e) {
e.printStackTrace();
}
戻り温度;
}
}