このプログラムは基本的に、data.bin という名前のバイナリ ファイルから膨大な量のデータを読み取ります。ファイル内の各項目は 1024 バイト長です。各項目の最初の 24 バイトがキーで、残りの 1000 バイトはランダムな情報です。そして、これらすべてのアイテムを「items」という配列リストに追加し、マージ ソート アルゴリズムを使用してソートできるようにします。
しかし、約227475個のアイテムを追加した後、ERRORでコメントされた行でOutOfMemoryErrorを取得しています。これはすべて外部でソートされるはずですが、明らかに正しく機能していません。では、大量のアイテムを小さなセットに分割して、並べ替えてからマージするにはどうすればよいでしょうか?
public static void main(String[] args)
{
System.out.println("Welcome to external merge sorter.");
ArrayList<Entry<BigInteger, BigInteger>> items = new ArrayList<Entry<BigInteger, BigInteger>> ();
TEntry<BigInteger, BigInteger> en = null;
try {
RandomAccessFile data = new RandomAccessFile("data.bin","rws");
System.out.println("Found file data.bin.");
long length = data.length();
long recs = length / 1024;
long count = 0;
byte []b = new byte[1024];
System.out.println("Sorting...");
while(count < recs)
{
count++;
data.readFully(b);
byte []key = Arrays.copyOfRange(b, 0, 24);
byte []value = Arrays.copyOfRange(b, 24, 1024);
System.out.println(count);
//ERROR
en = new TEntry<BigInteger, BigInteger>(new BigInteger(key), new BigInteger(value));
items.add(en);
}
}
catch (Exception e) {
e.printStackTrace();
}
ItemCompare compare = new ItemCompare();
MergeSort sorter = new MergeSort();
sorter.sort(items, compare);
System.out.println("Done!");
}