1.99 GB のキャラクター ファイルがあります。ここで、そのファイルから数百万のサブシーケンスをランダムに抽出したいと考えています。どうすればいい方法でそれを行うことができますか?
注意: ファイル全体をメモリに入れるには十分なメモリがありません。
1.99 GB のキャラクター ファイルがあります。ここで、そのファイルから数百万のサブシーケンスをランダムに抽出したいと考えています。どうすればいい方法でそれを行うことができますか?
注意: ファイル全体をメモリに入れるには十分なメモリがありません。
ファイルを固定サイズの複数のファイル(たとえば、それぞれ16K)に分割します。
char nを読み取るときは、n/filesizeを実行してファイルを取得します。n%filesizeを使用して、ファイルの開始文字を取得します。ファイルテールを読み取るには、ロジックを追加して次のファイルを読み取るか、各ファイルに次の100文字を追加します(次のファイルに複製します)。
もちろん、元のファイルだけを使用して、seek
毎回開く/実行するというオプションがあります。しかし、そのパフォーマンスについてはよくわかりません。OSによって大きく異なる可能性があります。
オプション2:多数のランダムインデックスを生成し、それらを並べ替えます。次に、ファイル(RandomAccessFileまたはFileInputStream)を1回スイープして、すべてのチェーンを取得します。これにより、HD時間が最小限に抑えられます。問題は、インデックスの保存に必要なメモリ/インデックスの注文に必要な時間を制御することです。また、キャラクターが2つ以上のチェーンに属している場合は、さらに複雑になります。
RandomAccessFileを試すことができます-ファイルをランダムな位置にシークし、必要な量の文字を読み取ることができます。
開始インデックスで必要なサブシーケンスを並べ替えます。
今、それらを歩き始めます。RandomAccessFile を使用して、必要な次のサブシーケンスの開始点からディスクのブロックを取得します。
ブロックのサイズは、ヒット率 (ブロックの残りの部分がどれくらい有用であるか) によって異なります。ヒット率が高いほど、ブロックは大きくなります (もちろん、ある程度までは)。サブシーケンス リストを先読みし、それに応じてブロックサイズを調整することを検討してください。ブロックから可能なすべてのサブシーケンスを引き出します。完了するまで繰り返します。
他の場所に記載されている 2GB を超えるファイルの問題が何であるかがわかりません。