0

データ パッケージを含む非常に大きなファイルがあります。ファイル自体は単純に非常に大きな文字列であり、パッケージは文字列 "PACK1.0" で区切られています。

「XXX」がデータであると仮定すると、パッケージは次のようになります。

PACK1.0XXXXXXXXXXXXXXXXXPACK1.0XXXXXXXXXXXXXXPACK1.0XXXXXXXXXX

パッケージの数とそれが始まるバイト数を含むハッシュマップを作成しています。

例:

PACKAGE NR | BYTE WHERE IT BEGINS IN THE STREAM
0 | 0
1 | 128
2 | 256
. | .
. | .

パッケージ番号 5340 が必要な場合は、ハッシュマップでパッケージの開始バイトを調べ、stream.seekg(POSITION) でそのバイトに移動し、理論的にはパッケージを解析します。

私の最後の問題は、再生と一時停止のオプションを使用して、スライダーを使用してファイルを移動したいということです。私の考えでは、スライダーには min=0 と max=packagecount の範囲があります。

これはファイルをトラバースする良い方法ですか?

これにより、どのような問題が発生する可能性がありますか? これを行うためのより良い方法は何ですか?

これは、ハッシュマップを格納するための私のコードです (このコードは、パッケージの長さが 128 バイトであることを前提としています)。

 std::map<int, int> THEMAP;

    thefile.seekg(0,std::ios::end);
    dataLength=thefile.tellg();
    thefile.seekg(0,std::ios::beg);

    while(position<dataLength)
    {
    thefile.seekg(0,position);
    position=position+128;
    packagecount++;
    THEMAP.insert(std::make_pair(packagecount,position));
    }
4

1 に答える 1

0

これは通常、memory-mapped-io (MMIO) の場合です。Windows のみの場合は、MapViewOfFileとそのファミリの他の関数を使用してください。クロスプラットフォームでの使用には、glib のファイル マップ関数をお勧めします。MMIO が行うことは、ファイルの一部 (またはファイル全体) をプロセスのメモリ空間にマップすることです。これにより、単純なポインターを介してアクセスできるようになります。ファイルのどの部分とどのサイズをマップするかは、任意に決定できます。

考えられる戦略は、起動時に、ファイルの固定ブロックをブロックごとにループ内のメモリにマップし、各ブロックで最初のパッケージ識別子を検索することです。これは比較的迅速で、マーカーの最初のセットを提供します。次回のアクセスでは、この初期セットを使用してファイルの適切な部分を見つけ、これをマップして、この部分のみをスキャンできます。もちろん、付属のマーカーを保存します。

後でファイルをスクロールするときは、ページをマップし (特定の時点で必要なデータの量に応じて、今回は小さくすることができます)、必要なデータを表示します。明らかに、パッケージ マーカーのアドレスは、メモリ マッピングの開始アドレスとして同時に使用できます。

良い副作用は、パッケージのサイズがまったく関係なく、ギガバイト サイズのファイルであっても、任意のサイズのファイルをマップできることです。ファイルで小さなビューを使用することにより、アプリケーションのメモリ要件を非常に小さくすることができます。

于 2013-05-07T12:03:18.137 に答える