解析存储在ASCII中的大型浮点文件的最佳方法是什么?

时间:2010-08-03 21:59:33

标签: c++ parsing file-io io ifstream

解析存储在ASCII中的大型浮点文件的最佳方法是什么?

最快的方法是什么?我记得有人告诉我使用ifstream很糟糕,因为它工作在少量字节上,最好先将文件读入内存。真的吗?

编辑:我在Windows上运行,文件格式用于存储在x y z r g b等行中的点云。我试图将它们读入数组。此外,文件大约每个20 MB,但我有大约10 GB的文件。

第二次编辑:每次我想要进行可视化时,我都必须加载要显示的文件,所以尽可能快地加载它会很好,但老实说,如果ifstream合理地预先形成,我不介意坚持使用可读代码。它现在运行速度很慢,但这可能比我在软件中所做的更多硬件I / O限制,我只想确认。

3 个答案:

答案 0 :(得分:4)

我认为你的第一个问题应该是浮点数的大小。它们是浮动还是可以存在双重数据?传统的(C)方式是使用fscanf和float的格式说明符,而afaik则相当快。在解析数据方面,iostream确实增加了一小部分开销,但这可以忽略不计。为了简洁起见,我建议你使用iostreams(更不用说你会得到的常用流功能)。

此外,我认为如果您可以在问题中添加相关数字,例如您要解析的文件有多大,我会真的对社区有所帮助吗?这是一个小内存占用环境(如嵌入式系统)。

答案 1 :(得分:1)

这一切都基于操作系统,以及C和C ++标准库的选择。

ifstream缓慢的日子已经过去了,但是,处理C ++通用接口可能会有一些开销。

如果字符串已经在内存中,

atof / strtod可能是处理它的最快方法。

最后,您在将文件读入内存时所做的任何尝试都可能是徒劳的。现代操作系统通常会受到阻碍(特别是如果文件大于RAM,您将最终交换代码,因为系统会将您(已经存储在磁盘上)的数据视为可交换的。)

如果你真的需要快得离谱(我认为唯一有用的地方是HPC和基于Map / Reduce的方法) - 尝试使用mmap(Linux / Unix)或MapViewOfFile将文件预取到虚拟内存中最明智的方法,然后是atof +自定义字符串处理。

如果这个游戏的文件组织得非常好,你甚至可以使用mmaps和指针进行古怪的操作,并将转换多线程化。如果你有超过10GB的浮动定期转换,听起来像一个有趣的运动。

答案 2 :(得分:0)

最快的方法可能是使用ifstream,但你也可以使用fscanf。如果您有特定的平台,可以将文件手动加载到内存中并手动解析浮动文件。