Boost Spirit QIでTPCHファイルを解析しようとしています。 私の実装は、Spirit QIの従業員の例(http://www.boost.org/doc/libs/1_52_0/libs/spirit/example/qi/employee.cpp)に触発されました。 データはcsv形式であり、トークンは '|'で区切られています。キャラクター。Boost Spirit QI slow
これは動作しますが、非常に遅い(1 GBの場合は20秒)。ここで
は、ラインアイテムのファイルのための私の気の文法である:
struct lineitem {
int l_orderkey;
int l_partkey;
int l_suppkey;
int l_linenumber;
std::string l_quantity;
std::string l_extendedprice;
std::string l_discount;
std::string l_tax;
std::string l_returnflag;
std::string l_linestatus;
std::string l_shipdate;
std::string l_commitdate;
std::string l_recepitdate;
std::string l_shipinstruct;
std::string l_shipmode;
std::string l_comment;
};
BOOST_FUSION_ADAPT_STRUCT(lineitem,
(int, l_orderkey)
(int, l_partkey)
(int, l_suppkey)
(int, l_linenumber)
(std::string, l_quantity)
(std::string, l_extendedprice)
(std::string, l_discount)
(std::string, l_tax)
(std::string, l_returnflag)
(std::string, l_linestatus)
(std::string, l_shipdate)
(std::string, l_commitdate)
(std::string, l_recepitdate)
(std::string, l_shipinstruct)
(std::string, l_shipmode)
(std::string, l_comment))
vector<lineitem>* lineitems=new vector<lineitem>();
phrase_parse(state->dataPointer,
state->dataEndPointer,
(*(int_ >> "|" >>
int_ >> "|" >>
int_ >> "|" >>
int_ >> "|" >>
+(char_ - '|') >> "|" >>
+(char_ - '|') >> "|" >>
+(char_ - '|') >> "|" >>
+(char_ - '|') >> "|" >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|' >>
+(char_ - '|') >> '|'
)), space, *lineitems
);
問題は、文字の解析のようです。それは他のコンバージョンよりもはるかに遅いです。 可変長トークンを文字列に解析するより良い方法はありますか?
私は一度同じことを経験しました。 Spirit qiは可変長文字列を効率的に処理できないようです。誰にでも解決策がありますか? – muehlbau