如何读/写矢量 作为存储器映射文件(S)?(How to read/write vector<

2019-10-18 19:25发布

我有大量的数据块(50GB〜)的。 在我的代码必须能够做到以下几点:

  1. 反复遍历所有块,并做他们一些计算。

  2. 反复遍历所有块,并做他们,其中在每次迭代中访问数据块的顺序是一些计算(尽可能)随机。

到目前为止,我已经将数据分割成10个二进制文件(创建boost::serialization ),并反复读一前一后进行计算。 对于(2),I读以随机顺序10个文件,并处理每一个在序列,这是足够好的。

然而,读取文件的一个(使用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的阵列?

Answer 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用作任何其他迭代中使用。



文章来源: How to read/write vector as memory mapped file(s)?