Boost logo

Boost :

Subject: Re: [boost] [spirit][qi] Fastest way to parse file
From: Jeff Flinn (Jeffrey.Flinn_at_[hidden])
Date: 2012-02-23 11:29:37


Antony Polukhin wrote:
> Hi,
>
> Boost.Spirit documentation advices to use multi_pass iterators for
> parsing files (or reading data to a STL container and then passing the
> begin and end of the container to Spirit.Qi).
>
> Much better solution would be to use a memory mapped file:
>
>
>
> boost::interprocess::file_mapping fm(filename.c_str(),
> boost::interprocess::read_only);
>
> boost::interprocess::mapped_region region(fm,
> boost::interprocess::read_only, 0, 0);
>
> const char* begin = reinterpret_cast<const char*>(region.get_address());
>
> const char* const end = b + region.get_size();

I switched from interprocess::file_mapping to
iostreams::mapped_file_source because of the formers lack of support for
wchar_t/unicode file names. It's also directly usable with
boost::filesystem::path. Here's an encapsulation of iterator/range view
of the mapped file:

#include <boost/filesystem/path.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/range/iterator_range.hpp>

class const_mapped_file
{
public:
     typedef boost::filesystem::path Path;
     typedef const char* Iterator;
     typedef boost::iterator_range<Iterator> IteratorRange;

     explicit const_mapped_file(const Path& p) : m_src(p) {}

        Iterator begin() const { return m_src.data(); }
        Iterator end() const { return m_src.data() + m_src.size(); }
        IteratorRange range() const { return IteratorRange(begin(), end()); }

private:
        boost::iostreams::mapped_file_source m_src;
};

Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk