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

5
什么是解析存储在ASCII格式中的大型浮点文件的最佳方法?
最快的方法是什么?我记得有人告诉我使用ifstream很糟糕,因为它只能处理少量字节,最好先将文件读入内存。这是真的吗?
编辑:我正在运行Windows,并且文件格式是以x y z r g b的形式按行存储的点云。我正在尝试将它们读入数组。此外,这些文件每个约为20 MB,但我有大约10 GB 的文件。
第二次编辑:我每次想要进行可视化时都必须加载文件,所以最好尽可能快,但是,如果ifstream表现合理,我不介意坚持可读性强的代码。它现在运行得非常慢,但那可能更多是硬件I/O限制,而不是我可以在软件中做的任何事情,我只是想确认一下。

你的意思是一个有很多浮点数的大文件吗? - Tim McNamara
“最好”的并不总是意味着“最快”。 - strager
1
多大的文件?您是否已经有一个不够快的例程? - Amardeep AC9MF
您应该发布文件格式的详细信息,这可能会影响答案的正确性。 - A. Levy
11
我认为你会对这篇文章末尾发现的统计数据感兴趣:http://www.codeproject.com/KB/recipes/Tokenizer.aspx - Matthieu N.
3个回答

4
我认为你首先应该关心浮点数的大小。它们是float还是可能会有double数据?传统(C)的方法是使用fscanf和浮点数的格式说明符,据我所知,速度相当快。iostreams在解析数据方面增加了一些小的开销,但这是相当可忽略的。为了简洁起见,我建议您使用iostreams(更不用说通常与其一起使用的流功能了)。
此外,如果您能在问题中添加相关数字,例如您试图解析多大的文件?这是一个小内存占用环境(如嵌入式系统)吗?这将真正帮助社区。

1

这完全取决于操作系统和C/C++标准库的选择。

使用缓慢的ifstream的日子基本上已经过去了,然而,处理C++通用接口可能会带来一些开销。

如果字符串已经在内存中,那么atof/strtod可能是处理它的最快方式。

最后,任何尝试将文件读入内存的行为很可能是徒劳的。现代操作系统通常会干扰(尤其是如果文件大于RAM,则会因为系统将您已经存储在磁盘上的数据视为可交换而进行代码交换)。

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

如果文件对于这种游戏确实非常有组织,甚至可以使用mmaps和指针进行奇特的多线程转换。如果你经常需要转换超过10GB的浮点数,听起来像是一个有趣的练习。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接