簡體   English   中英

解析以ASCII存儲的大型浮點文件的最佳方法?

[英]Best way to parse a large floating point file stored in ASCII?

解析以ASCII存儲的大型浮點文件的最佳方法是什么?

最快的方法是什么? 我記得有人告訴我使用ifstream是不好的,因為它只能處理少量的字節,最好先將文件讀到內存中。 真的嗎?

編輯:我在Windows上運行,並且文件格式用於存儲在xyzrg b等行中的點雲。 我試圖將它們讀入數組。 另外,每個文件大約20 MB,但是我擁有大約10 GB的文件。

第二次編輯:每次要進行可視化處理時,我都必須加載文件以顯示,因此最好盡快完成,但是老實說,如果ifstream合理地執行,我不會介意堅持具有可讀代碼。 我現在想確認一下,它的運行速度非常慢,但這可能是硬件I / O限制,而不是我在軟件中可以做的任何事情。

我認為您首先要關注的是浮點數有多大。 它們是浮動的還是也可以有雙重數據? 傳統的(C)方法是將fscanf與帶格式說明符的float和afaik一起使用,速度相當快。 iostream確實在解析數據方面增加了少量開銷,但這可以忽略不計。 為了簡潔起見,我建議您使用iostreams(更不用說通常使用的iostream功能)。

另外,我認為如果您可以在問題中加上相關數字,例如對您要解析的文件有多大,這將對社區有所幫助。 這是一個小的內存占用環境(例如嵌入式系統)嗎?

它們全部基於操作系統以及C和C ++標准庫的選擇。

緩慢的ifstream時代已經過去了,但是,處理C ++通用接口可能會產生一些開銷。

如果字符串已經在內存中,則atof / strtod可能是處理它的最快方法。

最后,您試圖將文件讀入內存的任何嘗試都可能是徒勞的。 現代操作系統通常會妨礙您的操作(尤其是如果文件大於RAM,您將最終交換代碼,因為系統會將您(已存儲在磁盤上的)數據視為可交換的)。

如果您確實需要非常快(我認為唯一有用的地方是基於HPC和基於Map / Reduce的方法),請嘗試mmap(Linux / Unix)或MapViewOfFile,以最明智的方式將文件預取到虛擬內存中方法,然后使用atof +自定義字符串處理。

如果該文件確實適合此類游戲,則您甚至可能對mmap和指針有些古怪,並且將轉換轉換為多線程。 如果您有超過10GB的花車要定期轉換,這聽起來很有趣。

最快的方法可能是使用ifstream,但您也可以使用fscanf。 如果您有特定的平台,則可以將文件手動加載到內存中,然后手動解析其中的浮點數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM