0

このプログラムは基本的に、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!");
  }
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 に答える