Tôi cố gắng phân tích các tệp TPCH bằng Boost Spirit QI. Thực hiện của tôi lấy cảm hứng từ ví dụ của nhân viên về Thần Khí QI (http://www.boost.org/doc/libs/1_52_0/libs/spirit/example/qi/employee.cpp). Dữ liệu ở định dạng csv và mã thông báo được phân cách bằng dấu '|' tính cách.Tăng cường tinh thần QI chậm
Nó hoạt động nhưng rất chậm (20 giây cho 1 GB).
Đây là ngữ pháp khí của tôi cho các tập tin chi tiết đơn hàng:
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
);
Vấn đề có vẻ là phân tích nhân vật. Nó chậm hơn nhiều so với các chuyển đổi khác. Có cách nào tốt hơn để phân tích mã thông báo có độ dài biến thành chuỗi không?
Tôi từng trải nghiệm giống nhau. Spirit qi dường như không thể xử lý các chuỗi có độ dài thay đổi một cách hiệu quả. Bất cứ ai có một giải pháp cho điều đó? – muehlbau