From 437f4c75d413049165a6e627f2a0cefb85ec0afb Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Fri, 26 Feb 2021 05:46:16 +0300 Subject: [coding] Added madvise for MmapReader. --- coding/mmap_reader.cpp | 35 ++++++++++++++++++++++++----------- coding/mmap_reader.hpp | 9 ++++++++- generator/intermediate_data.cpp | 4 ++-- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/coding/mmap_reader.cpp b/coding/mmap_reader.cpp index f5c3b23201..84c86aaf42 100644 --- a/coding/mmap_reader.cpp +++ b/coding/mmap_reader.cpp @@ -20,13 +20,8 @@ using namespace std; class MmapReader::MmapData { - int m_fd; - public: - uint8_t * m_memory; - uint64_t m_size; - - explicit MmapData(string const & fileName) + explicit MmapData(string const & fileName, Advise advise) { // @TODO add windows support #ifndef OMIM_OS_WINDOWS @@ -40,12 +35,23 @@ public: m_size = s.st_size; m_memory = static_cast( - mmap(0, static_cast(m_size), PROT_READ, MAP_SHARED, m_fd, 0)); + mmap(0, static_cast(m_size), PROT_READ, MAP_PRIVATE, m_fd, 0)); if (m_memory == MAP_FAILED) { close(m_fd); MYTHROW(OpenException, ("mmap failed for file", fileName)); } + + int adv = MADV_NORMAL; + switch (advise) + { + case Advise::Random: adv = MADV_RANDOM; break; + case Advise::Sequential: adv = MADV_SEQUENTIAL; break; + case Advise::Normal: adv = MADV_NORMAL; break; + } + + if (madvise(m_memory, s.st_size, adv) != 0) + LOG(LWARNING, ("madvise error:", strerror(errno))); #endif } @@ -57,13 +63,20 @@ public: close(m_fd); #endif } + + uint8_t * m_memory = nullptr; + uint64_t m_size = 0; + +private: + int m_fd = 0; }; -MmapReader::MmapReader(string const & fileName) - : base_type(fileName), m_offset(0) +MmapReader::MmapReader(string const & fileName, Advise advise) + : base_type(fileName) + , m_data(std::make_shared(fileName, advise)) + , m_offset(0) + , m_size(m_data->m_size) { - m_data = shared_ptr(new MmapData(fileName)); - m_size = m_data->m_size; } MmapReader::MmapReader(MmapReader const & reader, uint64_t offset, uint64_t size) diff --git a/coding/mmap_reader.hpp b/coding/mmap_reader.hpp index 1203d01b46..5d0d31a65f 100644 --- a/coding/mmap_reader.hpp +++ b/coding/mmap_reader.hpp @@ -11,7 +11,14 @@ class MmapReader : public ModelReader { public: - explicit MmapReader(std::string const & fileName); + enum class Advise + { + Normal, + Random, + Sequential + }; + + explicit MmapReader(std::string const & fileName, Advise advise = Advise::Normal); uint64_t Size() const override; void Read(uint64_t pos, void * p, size_t size) const override; diff --git a/generator/intermediate_data.cpp b/generator/intermediate_data.cpp index 9e3717a51c..61252d7ae4 100644 --- a/generator/intermediate_data.cpp +++ b/generator/intermediate_data.cpp @@ -75,8 +75,8 @@ private: class RawFilePointStorageMmapReader : public PointStorageReaderInterface { public: - explicit RawFilePointStorageMmapReader(string const & name) : - m_mmapReader(name) + explicit RawFilePointStorageMmapReader(string const & name) + : m_mmapReader(name, MmapReader::Advise::Random) {} // PointStorageReaderInterface overrides: -- cgit v1.2.3