0

1.99 GB のキャラクター ファイルがあります。ここで、そのファイルから数百万のサブシーケンスをランダムに抽出したいと考えています。どうすればいい方法でそれを行うことができますか?

注意: ファイル全体をメモリに入れるには十分なメモリがありません。

4

3 に答える 3

2

ファイルを固定サイズの複数のファイル(たとえば、それぞれ16K)に分割します。

char nを読み取るときは、n/filesizeを実行してファイルを取得します。n%filesizeを使用して、ファイルの開始文字を取得します。ファイルテールを読み取るには、ロジックを追加して次のファイルを読み取るか、各ファイルに次の100文字を追加します(次のファイルに複製します)。

もちろん、元のファイルだけを使用して、seek毎回開く/実行するというオプションがあります。しかし、そのパフォーマンスについてはよくわかりません。OSによって大きく異なる可能性があります。

オプション2:多数のランダムインデックスを生成し、それらを並べ替えます。次に、ファイル(RandomAccessFileまたはFileInputStream)を1回スイープして、すべてのチェーンを取得します。これにより、HD時間が最小限に抑えられます。問題は、インデックスの保存に必要なメモリ/インデックスの注文に必要な時間を制御することです。また、キャラクターが2つ以上のチェーンに属している場合は、さらに複雑になります。

于 2012-08-14T16:46:30.597 に答える
0

RandomAccessFileを試すことができます-ファイルをランダムな位置にシークし、必要な量の文字を読み取ることができます。

于 2012-08-14T16:49:30.257 に答える
0

開始インデックスで必要なサブシーケンスを並べ替えます。

今、それらを歩き始めます。RandomAccessFile を使用して、必要な次のサブシーケンスの開始点からディスクのブロックを取得します。

ブロックのサイズは、ヒット率 (ブロックの残りの部分がどれくらい有用であるか) によって異なります。ヒット率が高いほど、ブロックは大きくなります (もちろん、ある程度までは)。サブシーケンス リストを先読みし、それに応じてブロックサイズを調整することを検討してください。ブロックから可能なすべてのサブシーケンスを引き出します。完了するまで繰り返します。

他の場所に記載されている 2GB を超えるファイルの問題が何であるかがわかりません。

于 2012-08-14T17:24:28.703 に答える