5

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

最快的方法是什么?我记得有人告诉我使用 ifstream 不好,因为它只处理少量字节,最好先将文件读入内存。真的吗?

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

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

4

3 回答 3

4

我认为您首先关心的应该是浮点数有多大。它们是浮动的还是也可以有双重数据?传统的(C)方法是使用 fscanf 和浮点格式说明符,afaik 它相当快。iostreams 在解析数据方面确实增加了一点开销,但这可以忽略不计。为简洁起见,我建议您使用 iostreams(更不用说您将获得的常用流功能)。

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

于 2010-08-03T22:07:12.613 回答
1

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

缓慢的 ifstream 时代已经结束,然而,处理 C++ 泛型接口可能会有一些开销。

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

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

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

如果文件对于这种游戏来说组织得很好,你甚至可以对 mmaps 和指针进行古怪的处理,并进行多线程转换。如果您有超过 10GB 的浮点数可以定期转换,这听起来像是一项有趣的练习。

于 2010-08-03T22:09:27.270 回答
0

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

于 2010-08-03T22:03:07.080 回答