2014-02-28 57 views
2

我有一個樹數據結構,我想保存到磁盤。因此,具有內部樹結構的HDF5似乎是最佳人選。但是,到目前爲止,數據開銷很大,達到了100倍!PyTables和HDF5:大量的樹數據開銷

測試樹包含大約100個節點,葉子通常包含不超過2或3個數據項(如雙打)。如果我拿走整棵樹並醃製它,它大約是21kB。但是,如果我使用PyTables並將樹結構一對一映射到HDF5文件,則該文件佔用2.4MB(!)磁盤空間。這是很大的開銷嗎?

問題是開銷看起來並不是恆定的,而是隨着我的樹數據的大小線性縮放(以及隨着每個葉增加數據而增加節點,即擴大葉表的行數)。

我是否錯過了關於PyTables的一些事情,比如啓用壓縮(我認爲PyTables默認是這麼做的)?這可能是造成這種大規模開銷的原因?

非常感謝!

+0

爲什麼你有這麼小的葉子?我猜想這是你的大開銷的原因。 – filmor

+0

從一開始就沒有確定這些葉子的外觀(它們有多少等),它們相當獨立,而且數據不直接相關。所以我寧願他們分開。儘管如此,我還是不介意一些開銷,但是一千倍以上似乎難以處理。我的意思是存儲100個節點需要2.4 MB,真的嗎? – SmCaterpillar

+0

預先分配幾個K每個葉子似乎是一個合理的默認值,不是嗎? – filmor

回答

1

好的,所以我找到了一種大規模減小文件大小的方法。關鍵是,儘管我以前相信,PyTables並不會在默認情況下應用壓縮。

您可以通過使用Filters來實現此目的。

這裏是如何工作的一個例子:

import pytables as pt 

    hdf5_file = pt.openFile(filename = 'myhdf5file.h5', 
          mode='a', 
          title='How to compress data') 
    # for pytables >= 3 the method is called `open_file`, 
    # other methods are renamed analogously 

    myfilters = Filters(complevel=9, complib='zlib') 

    mydescitpion = {'mycolumn': pt.IntCol()} # Simple 1 column table 

    mytable = hdf5_file.createTable(where='/', name='mytable', 
            description=mydescription, 
            title='My Table', 
            filters=myfilters) 
    #Now you can happily fill the table... 

這裏最重要的行是Filters(complevel=9, complib='zlib')。它指定了 壓縮級別complevel和壓縮算法complib。默認情況下,級別設置爲0,這意味着禁用壓縮,而9是最高壓縮級別。有關壓縮如何工作的詳細信息:HERE IS A LINK TO THE REFERENCE。 (儘管我做了,但是我錯過了這一行「PyTables的一個優點是它支持表和數組上的壓縮,儘管默認情況下它沒有使用」 )

+0

我之前也陷入了這個陷阱。默認情況下禁用壓縮功能可能是正確的,但它並不像經常/明顯地跳出文檔一樣。如果你是最好的IO性能(當然你的數據/應用程序可能決定哪個壓縮庫是最好的),我強烈推薦blosc壓縮庫。 – mdscruggs

+0

我猶豫使用blosc。如果我使用blosc存儲數據,我不能再使用hdfview瀏覽和查看它。如果我打開通過blosc保存的表或數組,則會拋出錯誤。 – SmCaterpillar