解析存储在ASCII中的大型浮点文件的最佳方法是什么?
最快的方法是什么?我记得有人告诉我使用ifstream很糟糕,因为它工作在少量字节上,最好先将文件读入内存。真的吗?
编辑:我在Windows上运行,文件格式用于存储在x y z r g b等行中的点云。我试图将它们读入数组。此外,文件大约每个20 MB,但我有大约10 GB的文件。
第二次编辑:每次我想要进行可视化时,我都必须加载要显示的文件,所以尽可能快地加载它会很好,但老实说,如果ifstream
合理地预先形成,我不介意坚持使用可读代码。它现在运行速度很慢,但这可能比我在软件中所做的更多硬件I / O限制,我只想确认。
答案 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。如果您有特定的平台,可以将文件手动加载到内存中并手动解析浮动文件。