簡體   English   中英

如何讀/寫向量 <Chunk*> 作為內存映射文件?

[英]How to read/write vector<Chunk*> as memory mapped file(s)?

我有大量的數據塊(約50GB)。 在我的代碼中,我必須能夠執行以下操作:

  1. 重復遍歷所有塊並對其進行一些計算。

  2. 重復迭代所有塊並對其進行一些計算,其中在每次迭代中,(盡可能)將訪問的塊的順序隨機化。

到目前為止,我已經將數據拆分為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM