2017-05-26 75 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

相关问题