ファイルを 1 行ずつ読み取り、そこから整数を抽出しています。いくつかの注目すべき点:
- 入力ファイルがバイナリ形式ではありません。
- ファイル全体をメモリにロードできません。
ファイル形式 (区切り文字で区切られた整数のみ):
x1 x2 x3 x4 ... y1 y2 y3 ... z1 z2 z3 z4 z5 ... ...
context を追加するために、整数を読み取り、 を使用してそれらを数えていますstd::unordered_map<unsigned int, unsinged int>
。
次のように、単純に行をループして、役に立たない文字列ストリームを割り当てます。
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
}
700MBのファイルで約2.7秒かかります。
各行の解析:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (ss >> item);
}
同じファイルで最大 17.8 秒かかります。
演算子をstd::getline
+に変更するとatoi
:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (std::getline(ss, token, ' ')) item = atoi(token.c_str());
}
〜14.6秒になります。
これらのアプローチよりも速いものはありますか? ファイルの読み取りを高速化する必要はないと思います。解析自体だけです。ただし、どちらも害はありません(: