3

「ABCDEabcde.....XYZxyz」のような文字のシーケンスを含む大きなファイルがあります。ここで、そこからサブシーケンス文字列を抽出します。たとえば、10番目の文字列から50番目の文字列、15番目の文字から55番目の文字列(すべてのサブシーケンス文字列は同じ長さ、つまり40文字で、開始位置(10,15など)は常に増加しています)と言います。サブシーケンス位置は、1回の実行で10〜50文字、15〜55文字、別の実行で2〜42文字、100〜140文字の動的平均です。今、私はそのような動的なサブストリングを何百万も抽出する必要があります。私はここで私に提案されたようにいくつかの方法を試しました。しかし、私にとってはかなり遅いです。

私が試してみました:

1)BufferedReaderを使用して単純なバッファー読み取りを行い、必要な位置チャンクを待ちます。

2)ランダムアクセスファイルとSeekメソッドを使用してこれを行います。

私のファイルは約700mb(約2億文字)であり、そのような動的なサブ文字列を何百万も抽出する必要があるため、1分近くかかります(最初の1つはそれ以上かかります)。誰かがそれよりもおそらく速い他のアイデアを提供することによって私を助けることができますか?Javaライブラリを使用することも私にとっては問題ありません。

4

2 に答える 2

2

おそらくあなたができる最も効率的なことは、ファイル全体をメモリにマップすることです。基本的に:

FileChannel channel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());

これほど効率的な方法はないと思います。最近のOSは、メモリマップトファイルを非常にうまく最適化します。

于 2012-04-28T14:29:52.747 に答える
0

最も速い方法は、ファイル全体をメモリにロードし、そこから必要なサブストリングを抽出することだと思います。それは多くのメモリを消費しますが、はるかに高速になります(これがあなたが目指していることです)。

于 2012-04-28T14:32:24.593 に答える