ホームページ  >  に質問  >  本文

object-c - C++ を使用してファイルから 5,000 万のデータを読み取り、それをベクトルに保存する速度を向上させるにはどうすればよいですか?

txt ファイルから 5,000 万の double データを読み取り、ベクトルに格納する必要があります。最初はファイル io が遅すぎるのではないかと考えたので、ファイル メモリ マッピングを使用してファイルの内容をブロックとしてメモリに読み込みました。を実行し、ベクトルに 1 つずつ Push_back を実行しますが、ファイルからデータを 1 つずつ直接読み取るのにかかる時間はわずか 3 分でしたが、最適化した後は 5 分に増加しました。

私の最適化計画は、ファイル全体をメモリに読み込んで char* のバッファに置き、その後 vec_name.reserve(50000000); を使用して 5,000 万の容量を割り当て、繰り返しのメモリ割り当てを避けることですが、何も効果がありません。

主にプッシュバックに時間が費やされているからでしょうか?

何か良い最適化方法はありますか?皆さん、ありがとうございました!
最適化されたキーコードは次のとおりです: (すべてのデータをベクターに読み取るには 5 分かかります)

リーリー
PHP中文网PHP中文网2722日前1043

全員に返信(4)返信します

  • 漂亮男人

    漂亮男人2017-05-31 10:38:40

    デバッグ モードで実行するのは意味がありません。コードを使用してリリース モードで実行すると、所要時間はわずか 14 秒です。

    問題を解決するには、まず問題を見つけて、次のようにコードを変更し、まずどこに時間がかかっているかを見つけます

    リーリー

    つまり、ボトルネックは「ss_sim >> fVecSim」という文にあります。 atofは十分速いです。

    つまり、私の結論は次のとおりです。究極の最適化ソリューションは、ストレージ形式から始めて、データを文字列ではなくバイナリとして保存することです。これにより、文字列 IO と変換関数のオーバーヘッドが回避され、数秒でデータを取得できるようになります。

    返事
    0
  • phpcn_u1582

    phpcn_u15822017-05-31 10:38:40

    現時点で最も効率的な方法はストリームを使用することですが、それはコード実装からもわかります。すべてのファイルの内容を一度にバッファーに読み取ることになりますが、これは最良の方法ではありません。毎回平均してバッファ[1024] (1K またはその他の値) を読み取ることをお勧めします。 読み取り後、ポインターは次の行に移動し、EOF 位置の終わりまで読み取りを続けます

    返事
    0
  • 天蓬老师

    天蓬老师2017-05-31 10:38:40

    1. データ間に依存関係がない場合は、ブロック単位でマルチスレッドの読み取りを試みることができます。
    2. さらに、後続の走査がランダム アクセスでない場合は、リストを使用する方が効率的です。かなりの数です。

    返事
    0
  • 天蓬老师

    天蓬老师2017-05-31 10:38:40

    Cスタイルに切り替えることができますscanfお試しください


    わあ、なぜ私の答えをこのように扱うのですか?私を報告したネチズンは、なぜこの答えに何か問題があるのか​​尋ねたいと思います。

    返事
    0
  • キャンセル返事