2017-07-27 299 views
0

我在理解/管理VTK中.vtu文件的大小时遇到​​问题。我需要为具有数百万个单元和节点的六面体网格编写CFD输出。所以,我正在研究如何提高存储效率。我从简单的测试用例开始。了解vtu文件大小

案例1:80x40x40六面体网格,每个六面体有8个点。所以,总共有128000个单元和1024000个点。我们称之为C1.vtu。

案例2:80x40x40六面体网格,只有独特的点。所以总共有128000个单元和136161个点。我们称之为C2.vtu。

我在每种情况下为每个点存储一个矢量场(速度)。我使用vtkFloatArray来处理这些数据。 C1.vtu的大小是7.5 MB,C2.vtu文件是3.0MB。

这不是我在创建C2.vtu时所期望的。由于我在案例2中只存储了大约13%(案例1)的点数,我预计C2.vtu会相应减少(至少5次)。但是,减少只有2.5倍。

我想了解内部发生了什么。此外,我很感激任何关于进一步减小文件大小的见解。

我在Ubuntu12.04上使用vtk6.2和C++。

+1

如果你想减小尺寸写入二进制文件。 – AdityaG

+0

我是。上面报告的文件已经是二进制格式。 –

+0

文件大小与点数不成比例,因为单元格也需要存储。对于非结构化网格,每个单元可以是不同的类型,因此必须存储连接和单元类型信息。如果你的网格是一个结构化的网格,你可以使用vtkStructuredGrid,这应该可以帮助你节省更多的空间。 – mululu

回答

0

听起来像你有compression enabled in the writer; writer->GetCompressor()是否返回一个非NULL指针?如果是这样,那么这几乎肯定是文件大小差异的原因。如果没有压缩,我希望您报告的文件较大。如上所述,非结构化存储会增加连接开销。考虑你的网格C1和C2:

  • C1

    • 连通尺寸= 128000 *(1细胞类型+ 1个单元偏移+ 8点ID)*(每整数4或8个字节)
    • 点坐标尺寸= 1024000 *(3 coords)使用*(每个坐标4或8个字节)
    • 矢量场尺寸= 1024000 *(每个元组的3个分量)*(每个组件4或8个字节)
    • 这将是至少28.32 MiB(全部为int32/float 32)但你报告它是7.5 MB
  • C2

    • 连通尺寸= 128000 *(1细胞类型+ 1个单元偏移+ 8点ID)*(每整数4或8个字节)
    • 点坐标尺寸= 136161 *(3 coords)使用*(每个坐标4或8个字节)
    • 矢量场尺寸= 136161 *(每个元组的3个分量)*(每个组件4或8个字节)
    • 那至少8 MiB,但你报告3 MB。
+0

确实。我已经有了Zlib数据压缩器。那么,这是否意味着我无法进一步缩小尺寸? –

+0

没有更多的压缩而没有改变你使用的表示。如上所述,结构化网格使用较少。你说你的实际网格本质上是非结构化的,但是没有一个真实的例子,就没有办法看到你是否可以做一个像空白单元阵列一样的结构化网格。取决于应用,如果网格太大,也许你可以使用更粗糙的网格?这不像文件中有很多冗余信息,所以你期望得到多少压缩? – Drone2537

+0

使用粗糙的网格不在我手中。这完全取决于软件的用户。我是开发人员。我的任务是优化输出文件,以便于存储和后期处理。我在这里共享了两个典型的网格(https://ckadapa.wordpress.com/2017/08/04/vtk-files-fsi/) 有任何有效支持分层网格的VTK对象吗? –