1

大量のデータ チャンク (~50GB) があります。私のコードでは、次のことを実行できる必要があります。

  1. すべてのチャンクを繰り返し反復し、それらに対していくつかの計算を行います。

  2. すべてのチャンクを繰り返し反復し、それらに対していくつかの計算を行います。各反復では、訪問されたチャンクの順序が (可能な限り) ランダム化されます。

これまでのところ、データを 10 個のバイナリ ファイル ( で作成) に分割し、boost::serialization1 つずつ繰り返し読み取り、計算を実行しました。(2) については、10 個のファイルをランダムな順序で読み取り、それぞれを順番に処理します。これで十分です。

ただし、ファイルの 1 つを ( を使用してboost::serialization) 読み取るには時間がかかるため、高速化したいと考えています。

の代わりにメモリ マップド ファイルを使用できますboost::serializationか?

特に、vector<Chunk*>各ファイルに があります。そのようなファイルを非常に迅速に読み込めるようにしたいと考えています。

vector<Chunk*>このようなデータ構造を読み書きするにはどうすればよいですか? を参照しましたがboost::interprocess::file_mapping、やり方がわかりません。

これ ( http://boost.cowic.de/rc/pdf/interprocess.pdf )を読みましたが、メモリ マップ ファイルについてはあまり説明されていません。vector<Chunk*>最初にマップされたメモリに保存してから、チャンク自体を保存すると思います。そして、vector<Chunk*>実際にはoffset_ptr<Chunk>*、つまり、offset_ptr の配列になりますか?

4

1 に答える 1

1

メモリ マップド ファイルはメモリのチャンクであり、他のメモリと同様に、バイト、リトルエンディアン ワード、ビット、またはその他のデータ構造で構成されている場合があります。移植性 (エンディアンなど) が問題になる場合は、注意が必要です。

次のコードは、出発点として適しています。

#include <cstdint>
#include <memory>
#include <vector>
#include <iostream>
#include <boost/iostreams/device/mapped_file.hpp>

struct entry {
  std::uint32_t a;
  std::uint64_t b;
} __attribute__((packed)); /* compiler specific, but supported 
                              in other ways by all major compilers */

static_assert(sizeof(entry) == 12, "entry: Struct size mismatch");
static_assert(offsetof(entry, a) == 0, "entry: Invalid offset for a");
static_assert(offsetof(entry, b) == 4, "entry: Invalid offset for b");

int main(void) {
  boost::iostreams::mapped_file_source mmap("map");
  assert(mmap.is_open());
  const entry* data_begin = reinterpret_cast<const entry*>(mmap.data());
  const entry* data_end = data_begin + mmap.size()/sizeof(entry);
  for(const entry* ii=data_begin; ii!=data_end; ++ii)
    std::cout << std::hex << ii->a << " " << ii->b << std::endl;
  return 0;
}

data_begin および data_end ポインターは、他のイテレーターと同様に、ほとんどの STL 関数で使用できます。

于 2015-05-16T19:58:08.743 に答える