该程序基本上从名为 data.bin 的二进制文件中读取大量数据,其中文件中的每个项目都是 1024 字节长。每个项目的前 24 个字节是密钥,其余 1000 个字节只是随机信息。并将所有这些项目添加到一个名为“项目”的数组列表中,然后可以使用合并排序算法对其进行排序。
但是在添加大约 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!");
}