我有大量的数据块(50GB〜)的。 在我的代码必须能够做到以下几点:
反复遍历所有块,并做他们一些计算。
反复遍历所有块,并做他们,其中在每次迭代中访问数据块的顺序是一些计算(尽可能)随机。
到目前为止,我已经将数据分割成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的阵列?
由存储器映射的文件是一块内存,因为任何其它的存储器也可以以字节为单位,小端排序的话,比特,或任何其他数据结构来组织。 如果便携性是一个问题(如字节序)需要一定的照顾。
下面的代码可能是一个很好的起点:
#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用作任何其他迭代中使用。