std::istream
:
이
가장 가까운 결과 (사람들이 내가 보았다 실현 단지 있도록)이었다 추상적 유형 –이므로 직접 사용할 수 없습니다. 대한
#include <cstddef>
#include <string>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
namespace bip = boost::interprocess;
//...
std::string filename = /*...*/;
bip::file_mapping mapping(filename.c_str(), bip::read_only);
bip::mapped_region mapped_rgn(mapping, bip::read_only);
char const* const mmaped_data = static_cast<char*>(mapped_rgn.get_address());
std::size_t const mmap_size = mapped_rgn.get_size();
코드 : 메모리 매핑 자체로
#include <cstddef>
#include <string>
#include <streambuf>
#include <istream>
template<typename CharT, typename TraitsT = std::char_traits<CharT>>
struct basic_membuf : std::basic_streambuf<CharT, TraitsT> {
basic_membuf(CharT const* const buf, std::size_t const size) {
CharT* const p = const_cast<CharT*>(buf);
this->setg(p, p, p + size);
}
//...
};
template<typename CharT, typename TraitsT = std::char_traits<CharT>>
struct basic_imemstream
: virtual basic_membuf<CharT, TraitsT>, std::basic_istream<CharT, TraitsT> {
basic_imemstream(CharT const* const buf, std::size_t const size)
: basic_membuf(buf, size),
std::basic_istream(static_cast<std::basic_streambuf<CharT, TraitsT>*>(this))
{ }
//...
};
using imemstream = basic_imemstream<char>;
char const* const mmaped_data = /*...*/;
std::size_t const mmap_size = /*...*/;
imemstream s(mmaped_data, mmap_size);
// s now uses the memory mapped data as its underlying buffer.
, 나는이 목적을 위해 Boost.Interprocess을 사용하는 것이 좋습니다 : 당신은 배열 백업 streambuf
정의와 그것에서 파생해야한다 imemstream
은 this answer에서 취한 Dietmar Kühl입니다.
"* 파일을 메모리에 매핑하고 ** ** 행별로 구문 분석하려고합니다 *." 파일을 메모리 맵핑하려는 이유를 말씀해 주시겠습니까? 'ifstream'이나'fopen'을 사용하는 것만으로도 한 줄씩 파싱하지 않는 이유는 무엇입니까? –
@Rob, 순전히 성능상의 이유로. 내가 (false?) 인상 아래서 전체 파일을 빠르게 매핑하는 것입니까? – user997112
@ user997112 : 데이터로 수행하는 작업에 따라 다릅니다. 역 추적을 구현하는 적절한 구문 분석기에이 파일을 사용하는 경우 메모리 매핑 된 파일은 빠른 속도로 처리됩니다. 그러나 여러 개의 간단한'std :: getline' 호출과 같이 데이터를 통해 전달을 반복하는 경우 눈에 띄는 차이가있을 것입니다. 가상 주소 공간이 부족하지 않으면 (아마도 GB + 크기 파일이있는 32 비트 코드의 문제 일뿐 아니라) 메모리 매핑 파일을 사용할 때는 _harm_이 없습니다. – ildjarn