13 Aralık 2016 Salı

interprocess basic_managed_mapped_file Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/interprocess/managed_mapped_file.hpp>
managed_mapped_file sınıfı ile kardeştir.

Tanımlama
Şöyle yaparız.
using MMapManager = boost::interprocess::basic_managed_mapped_file<
    char,
    boost::interprocess::rbtree_best_fit<boost::interprocess::null_mutex_family,
                                         boost::interprocess::offset_ptr<void>,
                                         16u>,
    boost::interprocess::iset_index>;
Bu tip için allocator ve veri yapısı da tanımlanır. Şöyle yaparız.
using MMapAllocatorType = boost::interprocess::allocator<
    std::size_t,
    MMapManager::segment_manager>;

using MMapContainerType = boost::interprocess::vector<
    std::size_t,
    MMapAllocatorType>;
Constructor
Yeni bir dosya açmak için şöyle yaparız.
auto file = std::make_unique<MMapManager>(
        boost::interprocess::create_only,
        "...", 100000000u);
2. parametre olak dosya ismi için eğer geçici bir dosya ismi üretmek istersek şöyle yaparız.
boost::filesystem::path getTemporaryFilePath()
{
  auto ss = std::stringstream{};
  ss << "MMap_test_" << boost::uuids::random_generator{}();

  return boost::filesystem::temp_directory_path() / ss.str();
}
Üçüncü parametre olan dosya büyüklüğü için hesap yapmak istersek şöyle yaparız. Burada vector'ümüz içinde std::size_t sakladığı için sizeof (std::size_t) yapılıyor.
// I've measured this at 256 bytes for my example configuration, but it's not
// documented anywhere, so let's overcompensate
constexpr auto ManagedFileOverhead = 1024u;

// Create memory mapped file, initially for 100 items
auto capacity = 100u;
const auto size = (capacity * sizeof(std::size_t)) + ManagedFileOverhead;

Mevcut dosyayı açmak için şöyle yaparız.
auto file = std::make_unique<MMapManager>(
        boost::interprocess::open_only,
        "...", 100000000u);
construct metodu
Şöyle yaparız.
auto data = file->construct<MMapContainerType>("data_")
  (file->get_segment_manager());
Bu çağrında sonra elimizde bir vector vardır. Bu vector üzerindeki klasik işlemleri yapabiliriz. Şöyle yaparız.
// Fill with stuff
data->reserve(capacity);
for (auto i = 0u; i < capacity; ++i) {
  data->push_back(i);
}
destroy metodu
Şöyle yaparız.
file->destroy<MMapContainerType>("data_");
find metodu
Şöyle yaparız.
auto data = file->find<MMapContainerType>("data_").first;
grow metodu
Belleğin büyüklüğünü artırır. Şöyle yaparız.
MMapManager::grow("...", oldFileSize + extraBytes);

Hiç yorum yok:

Yorum Gönder