1

AHから40億のランダムな文字のインスタンスを生成し、それをすべてJavaのテキストファイルに保存しようとしています。カウンターが4Bに達するまで反復するベースライン方法を試しましたが、常にメモリの問題が発生することがわかりました。

文字を文字としてのプリミティブ値ではなく、ビットとして格納する方がメモリ効率が良いのではないかと思いました。次のような:

A <- 000, B <- 001, C <- 010, D <- 011, E <- 100, F <- 101, G <- 110, H <- 111

もしそうなら、私はこれをどのように行うのですか?


今後、これらすべてのランダムに生成された文字を含むテキストファイルを作成したら、txtファイルを開いてさらに変更を加えるための最良の方法は何でしょうか。たとえば、いくつかの文字を置き換えたり追加したりします。私はJavaのチュートリアルを調べて、ランダムアクセスファイルでうまくいくと思いますが、もっと良いオプションはありますか?

改行の読み取り機能が停止点になるように、n文字ごとに文字列に改行を追加する必要がありますか?

私の質問を簡潔に述べると、次のようになります。テキストファイルに40億のランダムな限定文字(26文字すべてではない)を効果的に生成して、将来の使用のために読み取ったり変更したりできるようにする方法は?

4

2 に答える 2

0

まず、ストレージを最適化する場合は、bytetypeを使用します。バイトは文字を元の値で格納できるため、何も変更する必要はありません。

元の保存のために行う最善のことはFileOutputStream、世代を「ページ」にすることです。たとえば、100メガバイトごとに書き込みます。

さらにファイルを実現するために、RandomAccessFile大丈夫です。ファイルにあるすべての「情報ユニット」の長さはすでにわかっているので、新しい行を追加しても良いとは思いません。新しい行を追加すると、ストレージスペースが複製されるだけです。

私がそれを明確にできることを願っています(そして理にかなっています):)

どうだったか教えてください。

于 2012-05-17T01:09:38.823 に答える
0

つまり、8 つの異なる値を 3 ビットで保存できます。したがって、1 バイトに 2x3 ビット、または 24/8=3 バイトに 8x3 ビットを格納できますが、それらを文字として格納すると、24 ビットの 3 文字 'A' - 'H' のみを意味します。

これは 8/3 の節約なので、15 億バイトで十分です。ただし、簡単な例を作成するには、8 で割り切れないシーケンスを格納する必要があると仮定すると、コードに未使用のバイトがいくつか含まれます。

001 000 である BA を保存し、そのバイトを 0010:0000 まで埋める必要があります。Bとどう見分けるの?B は 001 だけなので、埋めて 0010:0000 も。

Ok。ファイル長が 1.5 GB のファイルの場合、常に 1 バイトを追加できます。これにより、最後のバイトの何ビットを使用するかがわかります。上記の例では、一度 6 を追加し、一度 3 を追加します。

しかし今、何かを挿入する必要がある場合。常に 3 ビットのバイナリ シーケンスをシフトしますが、8 無効でない挿入がある場合、次のバイトを読み取ってビットストリームに追加することはできませんが、次のすべてのバイトを転置する必要があります。それを 2 つのピースに分割し、最初の部分をオーバーランに追加し、2 番目の部分を次のバイトのオーバーランとして保持します。

実装はそれほど複雑ではないかもしれませんが、ランタイムがどのように影響を受けるかはわかりません。

統計分析が役立つかもしれません。文字が追加される頻度と量。どのサイズでどのくらいの頻度で挿入されますか?

おそらく、ファイルをチャンクで編成する方が簡単でしょう.2MBのファイルが1000個あり、それぞれに追加する空きバッファが含まれています. 最後のバイトは、ファイル内のコンテンツと見なされるバイト数を指定できます。

データの挿入はどのように指定されますか? それは「2 713 345 947 の位置に配列「AHA」を挿入することでしょうか?それとも「FACHDAG」「BACH」の 3 番目の配列の後に挿入することでしょうか? 自然言語の単語のように、よく繰り返される典型的なシーケンスはありますか?

最初のケースでは、外部インデックスが非常に役立ちます。1000 個のファイルのうち、2,713,345,947 の位置がどのファイルであるかを調べて、平均して 1.5G の 50% を読み取る必要性をスキップすると、速度が大幅に向上する可能性があります。

ただし、統計分析が必要です。ファイルが大きくなったり、多かれ少なかれ同じサイズのままになったりします。読み書きの頻度。更新は、挿入、追加、削除です。

于 2012-05-17T02:05:01.753 に答える