ホームページ >バックエンド開発 >C++ >大規模なデータセットの Float 解析を最適化するにはどうすればよいですか?

大規模なデータセットの Float 解析を最適化するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-25 07:31:19735ブラウズ

How Can I Optimize Float Parsing for Large Datasets?

大規模なデータセットの Float 解析の最適化

大きなファイルからのスペースで区切られた float の解析は、時間のかかる作業となる可能性があります。これは、1 行に複数の float を含む数百万行を処理する場合に特に当てはまります。この課題に対処するには、パフォーマンスのボトルネックを最小限に抑える効率的な解析手法を採用することが不可欠です。

解析速度の測定

さまざまな解析手法の有効性を評価するためのベンチマークは次のとおりです。数百万のスペースで区切られた浮動小数点数を含む 515Mb の入力ファイルを使用して実行されます。その結果、異なるアプローチ間で解析時間に大きな違いがあることが明らかになりました。

Boost Spirit: トップ パフォーマー

驚くべきことに、Boost Spirit が最速の解析ソリューションとして浮上しました。この強力なライブラリには、従来の方法に比べていくつかの利点があります。

  • エラー処理: Spirit パーサーは解析エラーを自動的に検出して報告します。
  • 豊富な機能のサポート: 変数空白、/-Inf、
  • エレガントな構文: Spirit の構文は単純で簡単です。

その他の解析手法

Boost Spirit が解析速度でリードする一方、他の手法も有望な結果を示しました。

  • Eigen: この C ライブラリは、float を含む効率的な行列演算とベクトル演算を提供します。解析関数。
  • C 14 正規表現: C 14 の正規表現の改善により、正規表現を使用して解析を実行できます。
  • mmap: メモリ-マップされたファイルはファイル アクセスを高速化できますが、解析速度は向上しない可能性があります

ベンチマーク結果

次のグラフは、メモリ マップ ファイルを使用したさまざまな方法の解析時間をまとめています。

[画像解析時間ベンチマーク結果]

正しい選択アプローチ

最適な解析方法は、アプリケーションの特定の要件によって異なります。スピードと正確性が最優先される場合、Boost Spirit は優れた選択肢です。より単純なシナリオの場合は、Eigen または C 14 正規表現で十分です。

.hpp ファイル (古い実装)

std::vector<data> read_float3_data(std::string const &in)
{
  namespace spirit = boost::spirit;
  namespace qi = boost::spirit::qi;
  typedef std::vector<data> list;

  qi::rule<it, list(), qi::locals<bool>, data> triplet_rule =
      qi::phrase(
          (qi::double_ > qi::double_ > qi::double_) % qi::eol, qi::space, data());

  it first = in.begin();
  it last = in.end();
  it err  = in.end();
  bool parsing_ok = qi::phrase_parse(first, last, triplet_rule, qi::space,
                                            data(), qi::_pass, err);
  assert(parsing_ok && first == last);
  (void)err;
  return data();
}

以上が大規模なデータセットの Float 解析を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。