私はこれらの大きな市場データのpcapファイルを持っています。平均してそれぞれ20GBです。ファイルはパケットに分割されます。パケットはヘッダーとメッセージに分割されます。メッセージはヘッダーとフィールドに分かれています。フィールドはフィールドコードとフィールド値に分割されます。文字ベクトルを文字列に変換する最も効率的な方法
私は一度に1文字ずつファイルを読みます。私は、文字を読み込み、4つのコールバック関数、on_packet_delimiter、on_header_char、on_message_delimiter、on_message_charにconst refで文字を渡すファイルリーダークラスを持っています。メッセージオブジェクトは、同様の機能を使用してフィールドを構築します。
ここまで私は、文字を読んで何もしないのと比べて、効率がほとんど損なわれていないことに気付きました。
メッセージヘッダーを処理してメッセージの楽器シンボルを抽出している部分のコードは、処理がかなり遅くなります。 on_message_header_complete()
で
void message::add_char(const char& c)
{
if (!message_header_complete) {
if (is_first_char) {
is_first_char = false;
if (is_lower_case(c)) {
first_prefix = c;
} else {
symbol_vector.push_back(c);
}
} else if (is_field_delimiter(c)) {
on_message_header_complete();
on_field_delimiter(c);
} else {
symbol_vector.push_back(c);
}
} else {
// header complete, collect field information
if (is_field_delimiter(c)) {
on_field_delimiter(c);
} else {
fp->add_char(c);
}
}
}
...
void message::on_message_header_complete()
{
message_header_complete = true;
symbol.assign(symbol_vector.begin(),symbol_vector.end());
}
...
私はsymbol_vector
に文字を供給しています。ヘッダーが完成したら、Iteratorを使って文字列に変換します。これはこれを行う最も効率的な方法ですか?
[この 'std :: string'コンストラクタのリファレンス](http://en.cppreference.com/w/cpp/string/basic_string/basic_string)を参考にしてください。 –
'symbol'がメンバ変数で空であれば、これは効率的です。 – StoryTeller
私はコピーを含む最も効率的な答えを出しましたが、最初に 'std :: vector'が必要な理由はまだ分かりません。最初から 'std :: string'を使うだけです! –