首頁 >後端開發 >C++ >如何優化大型資料集的浮點解析?

如何優化大型資料集的浮點解析?

Linda Hamilton
Linda Hamilton原創
2024-11-25 07:31:19684瀏覽

How Can I Optimize Float Parsing for Large Datasets?

最佳化大型資料集的浮點解析

從大檔案中解析空格分隔的浮點可能是一項耗時的任務。當處理數百萬行且每行有多個浮點數時尤其如此。為了應對這項挑戰,必須採用有效的解析技術來最大限度地減少效能瓶頸。

測量解析速度

為了評估不同解析方法的有效性,基準是使用包含數百萬個空格分隔的浮點數的 515Mb 輸入檔進行。結果顯示不同方法之間的解析時間有顯著差異。

Boost Spirit:表現最佳

令人驚訝的是,Boost Spirit 成為最快的解析解決方案。這個強大的函式庫與傳統方法相比有幾個優點:

  • 錯誤處理:Spirit 解析器自動偵測並報告解析錯誤。
  • 豐富的功能支援:支援變數空格、/-Inf、和 NaN 值。
  • 優雅的語法:Spirit 的語法簡單易懂了解。

其他解析技術

雖然 Boost Spirit 在解析速度上處於領先地位,但其他技術也表現出了可喜的結果。

  • Eigen: 這個 C 函式庫提供了高效率的矩陣和向量運算,包括浮點解析函數。
  • 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();
}

以上是如何優化大型資料集的浮點解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn