[英]How to read/write vector<Chunk*> as memory mapped file(s)?
我有大量的數據塊(約50GB)。 在我的代碼中,我必須能夠執行以下操作:
重復遍歷所有塊並對其進行一些計算。
重復迭代所有塊並對其進行一些計算,其中在每次迭代中,(盡可能)將訪問的塊的順序隨機化。
到目前為止,我已經將數據拆分為10個二進制文件(使用boost::serialization
創建),然后一個接一個地重復讀取並執行計算。 對於(2),我以隨機順序讀取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函數一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.