2017-05-26 26 views
11

我有一個由100,000+行組成的數據框,每行有100,000列,總計爲10,000,000,000浮點值。是否可以將巨大的數據幀保存到實木複合地板中?

我已經成功在csv(製表符分隔)文件中讀取他們以前和我他們成功讀取到50個核至強機250GB RAM,並嘗試寫出來作爲.parq目錄,例如:

huge.csv中的花車被保存爲字符串,它是125GB。

import dask.dataframe as dd 
filename = 'huge.csv' 
df = dd.read_csv(filename, delimiter='\t', sample=500000000) 
df.to_parquet('huge.parq') 

已寫入huge.parq了近一個星期,該目錄是14GB而且好像節省.to_parquet不會很快停止任何時間的過程。

而且free -mh是顯示還是有留下的可用內存,但它採取挽救.parq目錄的時間是極其緩慢:

$ free -mh 
       total  used  free  shared buff/cache available 
Mem:   251G   98G   52G   10M  101G  152G 
Swap:   238G   0B  238G 

的問題是:

  • 鑑於大小數據幀和機器是否可以將dask數據幀保存到parquet文件中?

  • daskfastparquet花費這麼長時間來保存巨大的數據幀是否正常?

  • 有什麼方法可以估計保存鑲木地板文件所用的時間嗎?

+0

10e9浮點值對我來說似乎並不重要。 1e5列雖然。你有沒有考慮過使用dask.array和HDF5?這些可能更適合在兩個維度上進行阻止。 – MRocklin

+0

有沒有理由爲什麼dask.array和HDF5對於>>> no的數據框更好。列?什麼是「阻塞」? – alvas

+0

每個分區有多少行? read_csv按字節數分割,所以我期望有一小部分。對於每個分區的每一列,都有一段必須存在的元數據,使得您的元數據比我以前見過的任何元數據都大 - 但我期望它能夠正常工作。對於存儲陣列式的100kx100k浮點數,我實際上推薦[zarr](http://zarr.readthedocs.io/en/latest/)。 – mdurant

回答

8

正如上述評論的討論,沒有理論上的原因,.to_parquet()不應與您的數據處理。然而,列的數量非常大,並且由於每個列都有相關的開銷,所以這個過程需要很長時間並不奇怪 - 這不是典型的用例。

這聽起來像你的數據最好被認爲是一個數組而不是一張表。有陣列存儲機制允許您在每個維度上進行組合,例如zarr,這也允許進行各種壓縮和預過濾操作,從而可以有效利用光盤空間。 (其他格式,如HDF5也很受歡迎像這樣的任務)

的如何存儲10K 10K X數組的一個例子:

import dask.array as da 
import zarr 
arr = da.random.random(size=(10000, 10000), chunks=(1000, 1000)) 
z = zarr.open_array('z.zarr', shape=(10000, 10000), chunks=(1000, 1000), mode='w', dtype='float64') 
arr.store(z) 

現在z.zarr /包含100個數據文件塊。

就你而言,棘手的部分是讀取數據,因爲你不知道先驗行數。你可以使用

df = dataframe.read_csv(..) 
len(df) # get length 
z = zarr.open_arr(...) # provide dtype, size and chunk appropriately 
df.values.store(z) 

,或者它可能是更有效的包裝np.loadtxtdask.delayed放棄數據幀階段。

+0

有像KDD-2009(http://www.kdd.org/kdd-cup/view/kdd-cup-2009/Data)這樣的數據集,它有15k專欄和50k記錄。它不是100k到100k,但它是一個柱狀數據集,因此將它作爲矩陣處理沒有任何意義。你碰巧知道Dask DataFrame的限制嗎? –

+2

我會說沒有特別的限制,但是你在各種計算開銷中支付的價格將取決於你試圖做什麼。我希望能夠看到所有以鑲木地板存儲的數據的性能(有明智的列數據類型選擇)。 – mdurant

相關問題