2012-04-28 5 views
3

"ABCDEabcde ..... XYZxyz"のような文字列を含む大きなファイルがあります。今、私はそれからいくつかのサブシーケンスの文字列を抽出したいと思います。たとえば、10番目の文字から50番目の文字列、15番目の文字列から55番目の文字列(すべてのサブシーケンス文字列は同じ長さ、つまり40文字であり、開始位置(例:10,15)は常に増加しています)とします。サブシーケンス位置は、10から50番目の文字、15から55番目の文字、もう1つは2から42番目の文字、100から140番目の文字までの1回の実行における動的な手段です。今、私はそのような動的サブストリングを何百万も抽出する必要があります。私はいくつかの方法を試してみたhere。しかし、私にとってはかなり遅いです。ファイルからのJava動的サブストリングの抽出 - 高速ウェイ

1)使用BufferedReaderの簡単なバッファリング読書のため、必要な位置チャンクを待つ:

は、私が試してみました。

2)これを行うには、ランダムアクセスファイルとシークメソッドを使用します。

私のファイルは約700 MB(約200万の文字)であり、このような動的なサブストリングを何百万も抽出する必要があるため、私は1分ほどかかります。他のアイデアを提供することで誰よりも助けてくれるのですか?任意のJavaライブラリを使用することもOKです。

答えて

2

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

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

もっと効率的な方法はありません。近代的なOSはメモリマップされたファイルを非常にうまく最適化します。

+0

"ファイル全体をマップする" - 私は700 MBファイルを持っています。私の記憶は、他の多くのスレッドやデータ構造によって使用される制限された手段です。 700 MBファイルが大きすぎてメインメモリに収まらない。 – Arpssss

+0

@Arpsss誰もOSがファイル用に700Mバイトの物理メモリを割り当てるとは誰も言わない。十分な仮想メモリだけが必要です。これは32ビットプロセスで問題になる可能性があります。 NIOは、OSに応じて非常に低レベルのプロセスであるため、実際の情報ではまったく疎です。 [Windows docu](http://msdn.microsoft.com/en-us/library/ms810613.aspx) - Linuxをお持ちの場合は、mmapのマンページも役立ちます。 – Voo

+0

私は64ビットです。それに問題はない。しかし、どのようにサブシーケンスを抽出するのですか? – Arpssss

0

私は、最も速い方法は、ファイル全体をメモリにロードしてそこから必要な部分文字列を抽出することだと思います。それはたくさんの記憶を食べるでしょうが、はるかに速くなります(それはあなたが目指しているものです)。

+0

"ファイル全体を読み込む" - 私は700 MBのファイルを持っています。私の記憶は、他の多くのスレッドやデータ構造によって使用される制限された手段です。 700 mbのファイルが大きすぎてメインメモリに収まらない – Arpssss

関連する問題