【问题标题】:Best way to parse a large floating point file stored in ASCII?解析存储在 ASCII 中的大型浮点文件的最佳方法?
【发布时间】:2010-08-03 21:59:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的意思是一个包含很多浮点数的大文件吗?
  • “最佳”并不总是意味着“最快”。
  • 文件有多大?您是否已经制定了一个不够快的例行程序?
  • 您应该发布文件格式的详细信息。这可能会影响答案的正确性。
  • 我想你会对本文末尾的统计数据感兴趣:codeproject.com/KB/recipes/Tokenizer.aspx

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多