2

かなり頻繁に使用する大量のデータを含む高度にフォーマットされたファイルがあるため、それを std::map に保存し、boost::serialization ライブラリでシリアル化します。シリアル化コードは次のようになります。

boost::iostreams::filtering_ostream ofs {};
ofs.push (boost::iostreams::zlib_compressor ());
ofs.push (boost::iostreams::file_sink (file_name));
boost::archive::binary_oarchive oa {ofs};
oa << my_map;

しかし、特定のキーと値のペアなど、マップの一部だけが必要になる場合があります。ファイルからマップを部分的に逆シリアル化し、指定したペアのみを取得できるかどうか疑問に思っていますか? このようにして、ファイル全体をメモリに読み込む必要はありません。

4

1 に答える 1

1

データのインデックスを作成することもできますが、圧縮が存在する場合は使用が少し難しくなります。データ ファイルが圧縮されておらず、各レコードが 1 行にある場合、各行の連続したオフセットを固定幅レコード (符号なし 64 ビット数など) に格納するインデックスを作成できます。

行 5112 を見つけるには、インデックスを開いて をシークし、2 つの 、たとえばと5112 * 8を読み取ります。次に、データ ファイルを開き、レコードであるバイトをシークして読み取ります。uint64_tabab - a

データが圧縮されている場合は、圧縮ライブラリを調べて、バイトを含むファイルの領域のみを部分的に解凍できるかどうかを確認する必要があります[a, b)

于 2012-06-23T18:22:47.993 に答える