2

長さ2億2000万(固定)のintとfloatの配列があります。ここで、これらの配列をメモリとディスクに格納/アップロードしたいと思います。現在、これを解決するためにJavaNIOのFileChannelとMappedByteBufferを使用しています。正常に動作しますが、アレイをメモリからディスクに保存/アップロードするのに約5秒(壁時計時間)かかります。実はもっと速いものが欲しいです。誰かが私を助けることができますか、配列のアップロード/保存をはるかに高速にするための組み込みのJavaライブラリ/データベース/他のアプローチはありますか?私は特にディスクからメモリへのアップロードに関心があります。もっと速くしたいです。ですから、保存時間が長くなれば問題ありません。前もって感謝します。

私が使用しているコードを以下に示します(必要な場合)。

int savenum = 220000000 ;

public void save() {
 try {
    long l = 0 ;
FileChannel channel = new RandomAccessFile(str1, "rw").getChannel();
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_WRITE, 0, savenum * 8);
mbb.order(ByteOrder.nativeOrder());

for(int i = 0 ; i < savenum ; i++){
l = a[i] ;
 mbb.putLong(l);
}
channel.close();

FileChannel channel1 = new RandomAccessFile(str2, "rw").getChannel();
MappedByteBuffer mbb1 = channel1.map(FileChannel.MapMode.READ_WRITE, 0, savenum * 4);
mbb1.order(ByteOrder.nativeOrder());

for(int i = 0 ; i < savenum ; i++){
 int ll = b[i] ;
 mbb1.putInt(ll);
 }
 channel1.close();
 }
  catch (Exception e){
    System.out.println("IOException : " + e);
  }
 }

 public void load(){
 try{
 FileChannel channel2 = new RandomAccessFile(str1, "r").getChannel();
  MappedByteBuffer mbb2 = channel2.map(FileChannel.MapMode.READ_ONLY, 0, channel2.size());
 mbb2.order(ByteOrder.nativeOrder());
  assert mbb2.remaining() == savenum * 8;
 for (int i = 0; i < savenum; i++) {
 long l = mbb2.getLong();
 a[i] = l ;
 }
 channel2.close();

  FileChannel channel3 = new RandomAccessFile(str2, "r").getChannel();
   MappedByteBuffer mbb3 = channel3.map(FileChannel.MapMode.READ_ONLY, 0, channel3.size());
   mbb3.order(ByteOrder.nativeOrder());
   assert mbb3.remaining() == savenum * 4;
    for (int i = 0; i < savenum; i++) {
    int l1 = mbb3.getInt();
    b[i] = l1 ;
    }
    channel3.close();
    }

    catch(Exception e){
    System.out.println(e) ;
      }
    }
4

1 に答える 1

3

操作を高速化したい場合は、コードを変更して、コピーをまったく行わないようにすることができます。つまり、ByteBuffer、またはIntBufferまたはLongBufferを使用します。これには、すでにヒープから外したもののヒープにコピーを保存するという利点がありますが、使用するときにのみロードすることもできます。つまり、処理はロードと同時に実行できます。

このアプローチを使用すると、最初の「ロード」時間が約10ミリ秒に短縮され、OSですでに使用可能になっているため、「保存」時間はありません。

于 2012-06-22T13:44:22.503 に答える