0

该程序基本上从名为 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!");
  }
4

1 回答 1

2

因此,在您的情况下,这可能不是一个选项,或者您可能不想使用其他代码。但是,有几个很好的第三方库可以进行外部排序。这是我以前用过的,http://code.google.com/p/externalsortinginjava/。我发现它速度快,内存效率高。

这是一些示例代码使用

File f = new File("/file/to/sort");
Comparator<String> comparator = new Comparator<String>() {
    public int compare(String r1, String r2){
        return r1.compareTo(r2);}};
int maxNumberTempFiles = 1000;
Charset cs = Charset.defaultCharset();
boolean distinctValues = true;
List<File> l = ExternalSort.sortInBatch(f, comparator, maxNumberTempFiles,cs,null,distinctValues) ;
File sf = new File("sortedfile."+r.nextInt()+".tmp");
ExternalSort.mergeSortedFiles(l, sf, comparator,cs, true);
于 2013-05-06T02:26:38.060 回答