【问题标题】:How to write binary data to a file so that it can be read fast back?如何将二进制数据写入文件以便可以快速读取?
【发布时间】:2010-11-04 08:47:21
【问题描述】:

我需要编写一种文件格式,将数据写入文件并可以读回。

它应该能够以相当快的速度读回数据,这应该涉及将一大块数据blit到std::vector中(因为它们的存储总是连续实现的)。

但是,在编写文件时,我不知道如何对整数和其他类型的对齐和大小进行约束。

这应该怎么做?我在 Q6600 (x86) 上的 buntu linux 上使用 gcc。

举个例子:

struct Vertex
{
  float point [3];
  float normal [3];
  float texcoord [2];
}

稍后,数据存储在std::vector<Vertex> 中。我考虑过使用__attribute__ 并打包/对齐它,以便它在不同平台上更便携。

编辑: 我已经制定了规范,我打算使用它。最大的数据位是顶点和索引,因此它们将被读取为大块,例如(较大规范的一部分): VertexGroup 是一组共享一个特征的顶点。它们一次只能容纳一种材料,因此网格中应该包含许多材料。

<uint> thisid # Of this VertexGroup
<string> name
<uint> materialId # A material
<uint> vertexCount
for (vetexCount):
    <3xfloat> point
    <3xfloat> normal
    <2xfloat> texcoord
<uint> triangleCount
for (triangleCount):
    <3xuint> indices

【问题讨论】:

    标签: c++ linux file gcc binary


    【解决方案1】:

    如果它只是 POD(普通旧数据),没有指针,那么您可以只使用 fwrite 和 fread。当然,这假设您绝对会在相同的架构上读回与以前完全相同的格式。

    考虑boost serialization

    【讨论】:

    • boost 序列化有多快?这可以为我省去很多麻烦,看看它是如何工作的会很有趣。我想知道它是如何处理数组的,以及处理速度有多快(文件中有大约 1000000 个顶点,因此不仅将整个数据块写入内存会更慢)。
    【解决方案2】:

    这取决于您的编译器和平台。据我所知,如果不定义大量自己的宏,就无法以完全跨编译器和跨平台的方式强制执行此操作。

    但是,VC++ 和 GCC(两个大)都支持 #pragma pack 指令,这将允许您为您的结构定义对齐和打包。请参阅http://msdn.microsoft.com/en-us/library/2e70t5y1.aspxhttp://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

    考虑到这一点,您可以使用#pragma pack 来定义结构的对齐方式,然后使用fread() 或类似方法来简单地将字节从文件传输到内存。您可能希望在列表前面加上列表长度,以便一次为整个列表分配内存,然后使用单个 I/O 调用加载整个文件。

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 2016-12-21
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2015-05-06
      • 2021-07-02
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多