0

次の最小限の作業例があります。これは、データファイル「info.txt」から一連の数値を現在どのようにロードしているかを示しています。

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {

double temp_var;
vector<double> container_var;

ifstream test("info.txt");

while(test>>temp_var)
{
    container_var.push_back(temp_var);
}


cout << container_var[0] << endl;
return 0;
}

ファイル「info.txt」には、次の形式の整数が含まれています

1.0
2.1
3.6
...

おそらく 50.000 から 100.000 の数字 (おそらくそれ以上) をロードする予定なので、これを効率的に行うことに関心があります。読み込みプロセスを遅くする可能性がある、私の例で見逃した基本的なものはありますか?

4

3 に答える 3

1

まず、できるデータを読み取る必要があります..

a. ファイルを開き、そこから読み取る

b. メモリを割り当てる その中のファイルの内容をコピーする

c. ファイルのメモリマップ

ファイルのサイズによっては、データの割り当てとコピーのコストを回避し、ファイルから単純に読み取るよりもはるかに高速であるため、 c が最適なオプションであると言えます。

次に、明らかに内容を解析する必要があります。これを行う最善の方法は、手巻きループです。詳細については、 http: //tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/ を参照してください。私はこれを自分で試しましたが、これは大きなファイルを処理する方法です。

そして 3 番目に、割り当てを最小限に抑えるために、結果を格納するバッファーを事前に割り当てる必要があります。

もちろん、パフォーマンスを測定する必要があります..ホットスポットを見つけます..それらを取り除きます.すすぎ、繰り返します.

于 2012-10-17T21:35:47.747 に答える
1

数値の量が事前にわかっている場合はstd::vector、スペースを事前に割り当てるように指示できます。これにより、push_back機能がより効率的になります。

その他の最適化手法には、メモリ マップ ファイルダブル バッファリングなどがあります。

于 2012-10-17T18:31:21.510 に答える
1

多くの要素を std::vector に追加しようとすると、要素を追加している間にベクトルが大きくなります。ベクターが成長すると、通常はすべてのデータを新しいバッファーにコピーする必要があります。多くの要素を追加する前に、多くのスペースを予約するようにベクターに指示して、成長操作とコピー操作の数を低く抑えることができます。

std::vector<int> v(5000);

上記は、すでに 5000 個の要素を持つベクトルを作成します (デフォルトで初期化されています)。std::vector::reserve() を呼び出すことで、構築後にさらにスペースを予約できます。

std::vector<int> v;
v.reserve(10000); // ensure the vector has a capacity of at least 10k elements

これが実際の問題だと思いますが、問題はラインにもある可能性がありますcout << container[0] << endl。std::endl はファイル バッファをフラッシュするため、通常は低速です。3 つ目の理由として、std::coutストリームが C-stdio ファイル API と同期されていることが考えられます。同期により、すべての文字が書き込まれた後に iostreams ライブラリが強制的にフラッシュされます。この同期は次の方法で無効にできます。

std::cout.sync_with_stdio(false);
于 2012-10-17T18:31:42.410 に答える