txt ファイルから 5,000 万の double データを読み取り、ベクトルに格納する必要があります。最初はファイル io が遅すぎるのではないかと考えたので、ファイル メモリ マッピングを使用してファイルの内容をブロックとしてメモリに読み込みました。を実行し、ベクトルに 1 つずつ Push_back を実行しますが、ファイルからデータを 1 つずつ直接読み取るのにかかる時間はわずか 3 分でしたが、最適化した後は 5 分に増加しました。
私の最適化計画は、ファイル全体をメモリに読み込んで char* のバッファに置き、その後 vec_name.reserve(50000000); を使用して 5,000 万の容量を割り当て、繰り返しのメモリ割り当てを避けることですが、何も効果がありません。
主にプッシュバックに時間が費やされているからでしょうか?
何か良い最適化方法はありますか?皆さん、ありがとうございました!
最適化されたキーコードは次のとおりです: (すべてのデータをベクターに読み取るには 5 分かかります)
デバッグ モードで実行するのは意味がありません。コードを使用してリリース モードで実行すると、所要時間はわずか 14 秒です。
問題を解決するには、まず問題を見つけて、次のようにコードを変更し、まずどこに時間がかかっているかを見つけます
リーリーつまり、ボトルネックは「ss_sim >> fVecSim」という文にあります。 atofは十分速いです。
つまり、私の結論は次のとおりです。究極の最適化ソリューションは、ストレージ形式から始めて、データを文字列ではなくバイナリとして保存することです。これにより、文字列 IO と変換関数のオーバーヘッドが回避され、数秒でデータを取得できるようになります。
現時点で最も効率的な方法はストリームを使用することですが、それはコード実装からもわかります。すべてのファイルの内容を一度にバッファーに読み取ることになりますが、これは最良の方法ではありません。毎回平均してバッファ[1024] (1K またはその他の値) を読み取ることをお勧めします。 読み取り後、ポインターは次の行に移動し、EOF 位置の終わりまで読み取りを続けます
1. データ間に依存関係がない場合は、ブロック単位でマルチスレッドの読み取りを試みることができます。
2. さらに、後続の走査がランダム アクセスでない場合は、リストを使用する方が効率的です。かなりの数です。
Cスタイルに切り替えることができます
scanf
お試しくださいわあ、なぜ私の答えをこのように扱うのですか?私を報告したネチズンは、なぜこの答えに何か問題があるのか尋ねたいと思います。