2017-05-20 7 views
1

私のプログラムは、大きなデータファイルを処理し、メモリ内にルックアップテーブルを作成して、ファイルを検索せずにファイル内のレコードにアクセスする必要があります。たとえば、構造[name、seekLocation]の配列を作成し、アルファベット順にソートすることで、より高速な検索アルゴリズムを実装することができます。ファイルをメモリに保存し、データを解析することなくロードしますか?

このルックアップテーブルをプログラムを実行するたびに作成する代わりに、このテーブルを一度作成してファイルに保存することはできますか?

もちろん、1つの方法はそれだけです。それをファイルに保存して読み込み、解析してループ内の構造を埋めます。

しかし、私はそれを解析する必要があるデータとして保存したくありません。配列を含むメモリブロック全体を生のバイナリファイルに保存したい。次に、ファイルをメモリにロードし、そのブロックの先頭へのポインタを定義し、すべての要素をアドレス指定することができます。

どうすればいいですか?オペレーティングシステムや言語は、特にセキュリティ問題のためにそれを行うことを禁止していますか?もしそうでなければ、私はそれをするのに役立つライブラリやコードがありますか?

可能であれば、データ(リンクされたリスト)がばらばらになっている可能性がありますか?

正しい方向のポインタがあれば助かります。ありがとうございました。

私はLinuxでC++を使用しています。

+0

データにポインタが含まれている場合は、それをダンプして再ロードするだけではありません。そして、* std strings *や* std vectors *のようなものにポインタを隠すことができることを覚えておいてください。たとえそれがポインタを含んでいなくても、あなたを動かすことができるものがあります。 – Galik

+0

@Galikはい、おそらくポインタで作業することはできませんが、単なるデータブロックであれば、なぜ理論的にはできないのかわかりません。 –

+0

"普通の古いデータ"(本質的にはプリミティブ型)なら、うまくいくはずですが、問題があります。バイナリデータファイルは、システム間で互換性があることは保証されていませんが、別のフラグを使用してコンパイルされた同じプログラムまたはそれ以降のバージョンのコンパイラと互換性がない場合もあります。これらのことは必然的に頻繁に変わるわけではありませんが、そうであれば保証はありません。 – Galik

答えて

0

あなたはシリアライズ/デシリアライズについて話しています。

'ソート済み'テーブルを実装するプリンシパルクラスをprotobufというメッセージで表すことができる場合は、ダンプとリロードのステージは簡単です。

主な手順は次のようになります。

  1. protoc付きコンパイルmyclass.proto(linuxの下、適切いるProtobufパッケージをインストール)
  2. それにmyclass.protoファイルを作成し、構造を記述する。これはmyclass.pb.cppを生成し、ラッパークラス
  3. あなたのラッパークラスにそのよう

何かを「ロード」&「保存」を実装するに

  • 使用このクラスをmyclass.pb.h必要があります。

    #include "myclass.pb.h" 
    class wrapper 
    { 
        myclass _protobuf_data; 
        public: 
        void load(std::string filename) 
        { 
         std::fstream input(filename.c_str(), ios::in | ios::binary); 
         // add some err managt here (file not exists, etc.) 
         _protobuf_data.ParseFromIstream(&input); // <<= reload file   
        } 
    
        void save(std::string filename) 
        { 
         fstream output(filename.c_str(), ios::in | ios::binary); 
         _protobuf_data.SerializeToOstream(&output); // <<= save file  
        } 
    
    
    }; 
    
  • +0

    これは私が望んだものより少し複雑ですが、私が必要としているもののようなものです。ありがとう。 –

    +0

    追加された値はステップ1で、他のものは配管だけです。 – norisknofun

    関連する問題