2017-05-26 3 views
11

私は100,000以上の行で構成されたデータフレームを持ち、各行は100,000列、合計で10,000,000,000までの浮動小数点値を持ちます。巨大なdaskデータフレームを一見に保存できますか?

私はcsv(タブ区切り)ファイルで以前にそれらを読んで、私は成功した250ギガバイトのRAMと50コアのXeonマシンにそれらを読み、など.parqディレクトリとしてそれを書いてみることができた:

huge.csvの浮動小数点数は文字列として保存され、125GBです。それは週に近く、ディレクトリのhuge.parqに書いてきた

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

は14ギガバイトで、.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データフレームを寄木張りファイルに保存することは可能でしょうか?

  • 巨大なデータフレームを保存するのに、daskfastparquetの時間がかかるのは正常ですか?

  • 寄木細工のファイルを保存するのにかかる時間を見積もる方法はありますか?

+0

10e9浮動小数点値は私にとって巨大に見えません。 1e5の列はそうです。 dask.arrayとHDF5の使用を検討しましたか?これらは、両方のディメンションでのブロッキングに適している可能性があります。 – MRocklin

+0

dsk.arrayとHDF5が>>>いいえのデータフレームに適している理由はありますか?列の? 「ブロッキング」とは何ですか? – alvas

+0

パーティションあたりの行数はいくつですか? read_csvはバイト数を分割しているので、小さい数字が必要です。各パーティションの各列には、存在しなければならないメタデータが別に存在し、これまでに見たメタデータよりもメタデータが大きくなっていますが、動作することが期待されます。配列のような100kx100k浮動小数点数を格納するために、私は実際に[zarr](http://zarr.readthedocs.io/en/latest/)を推奨します。 – mdurant

答えて

8

上記のコメントで述べたように、.to_parquet()があなたのデータに対処するべきではないことは理論的な理由はありません。ただし、列数は非常に多く、それぞれに関連するオーバーヘッドがあるため、プロセスに長い時間がかかることは驚くことではありません。これは典型的な使用例ではありません。

あなたのデータが表ではなく配列として最もよく考えられるように聞こえます。ディスク領域の効率的な使用を可能にするさまざまな圧縮および事前フィルタリング操作も可能にする、すべての次元でチャンク化できるアレイ記憶メカニズムがあります(例:zarr)。 (HDF5のような他の形式は、このようなタスクのためにも人気があります)

10K X 10K配列を格納する方法の例:今

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) 

を使用することができますか、データフレームのステージを見送るためにdask.delayednp.loadtxtをラップする方が効率的かもしれません。

+0

KDD-2009(http://www.kdd.org/kdd-cup/view/kdd-cup-2009/Data)のようなデータセットがあります。これには15k列と50kレコード。これは100kで100kではありませんが、柱状のデータセットですので、行列として扱うのは意味がありません。 Dask DataFrameの限界を知っていますか? –

+2

私は特別な制限はないと言いますが、さまざまな計算のためのオーバーヘッドで支払う価格は、あなたがしようとしていることによって異なります。列データ型の賢明な選択肢を使って、寄せ木のように格納されたすべてのデータのパフォーマンスを確認することに興味があります。 – mdurant

関連する問題