2017-07-27 46 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對象嗎? –