Ich versuche, TPCH-Dateien mit Boost Spirit QI zu analysieren. Meine Implementierung inspiriert durch das Mitarbeiterbeispiel von Spirit QI (http://www.boost.org/doc/libs/1_52_0/libs/spirit/example/qi/employee.cpp). Die Daten sind im CSV-Format und die Token sind durch ein '|' Charakter.Boost Spirit QI langsam
Es funktioniert, aber es ist sehr langsam (20 Sek. Für 1 GB).
Hier ist mein Qi grammer für die lineitem Datei:
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
);
Das Problem scheint der Charakter-Analyse zu sein. Es ist viel langsamer als andere Konvertierungen. Gibt es eine bessere Möglichkeit, variable Länge Tokens in Zeichenfolgen zu analysieren?
Ich habe einmal das gleiche erlebt. Spirit Qi scheint nicht in der Lage zu sein, Strings variabler Länge effizient zu handhaben. Hat jemand eine Lösung dafür? – muehlbau