4

I/O 集中型のプロデューサーとコンシューマーの問題を解決しようとしています。プロデューサ定数はデータをファイルに追加し、コンシューマはこの増大するファイルから読み取ります。通常、ファイル サイズは GB (約 10GB) 単位です。

最初に、BufferedOutputStream と BufferedInputStream を試して、データをファイルに読み書きしました。午前 9 時 30 分に発生するデータのバースト中に、30 ~ 40% (I/O のシステム コールである必要があります) のようにシステム CPU の使用率が高すぎます。

これを高速化するためにメモリマップファイルを調べます。

    File fileToRead= new File("C:\\readThisFile.dat");
    FileChannel inChannel = new FileInputStream(fileToRead).getChannel();
    MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size()); 
    byte[] data = new byte[(int)inChannel.size()];
    buffer.get(data);

1) ファイル readThisFile.dat size() が INTEGER.MAX の長さを超えているため、inChannel.map() は例外をスローします。

2) 非常に大きなファイルのメモリ マップド ファイルを使用して、消費者が常にデータを読み取る方法。消費者は毎回 100MB をロードして、さらに多くのデータを探し続けることができますか?

3)Javaでメモリマップファイル以外の何かを試すようなより速い解決策はありますか?

4

0 に答える 0