代码之家  ›  专栏  ›  技术社区  ›  Xzhsh

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

  •  5
  • Xzhsh  · 技术社区  · 16 年前

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

    最快的方法是什么?我记得有人告诉我使用ifstream很糟糕,因为它只能处理少量字节,所以最好先将文件读取到内存中。是真的吗?

    编辑:我在Windows上运行,文件格式是针对存储在x y z r g b等行中的点云的。我正在尝试将它们读取到数组中。另外,每个文件大约20兆字节,但我有大约10兆字节的文件。

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Gangadhar    16 年前

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

    另外,我认为如果你能在你的问题中加上相关的数字,比如说,你试图解析的文件有多大,这将真正有助于社区的发展。这是一个小内存占用环境(像嵌入式系统)。

        2
  •  1
  •   qdot    16 年前

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

    IfStand慢的时代已经过去了,但是,处理C++泛型接口可能会有一些开销。

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

    最后,任何试图将文件读入内存的尝试都可能是徒劳的。现代操作系统通常会遇到阻碍(尤其是当文件大于RAM时,由于系统会将(已经存储在磁盘上的)数据视为可交换数据,所以最终会交换代码)。

    如果您真的需要非常快(我认为它唯一有用的地方是基于hpc和map/reduce的方法),请尝试mmap(linux/unix)或mapviewoffile以最合理的方法将文件预取到虚拟内存中,然后使用atof+自定义字符串处理。

    如果这种游戏的文件组织得很好,那么你甚至可以使用mmap和指针来进行奇怪的转换,并且可以进行多线程转换。如果您有超过10GB的浮点数要定期转换,听起来像是一个有趣的练习。

        3
  •  0
  •   Puppy    16 年前

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