【发布时间】:2017-10-26 22:29:50
【问题描述】:
我有一个由 100,000 多行组成的数据框,每行有 100,000 列,总共有 10,000,000,000 个浮点值。
我之前已经设法在 csv(制表符分隔)文件中读取它们,并且我成功地将它们读取到具有 250GB RAM 的 50 核 Xeon 机器并尝试将其写为 .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 文件是否可行?
dask和fastparquet需要这么长时间来保存大量数据帧是否正常?有什么方法可以估算保存 parquet 文件所需的时间吗?
【问题讨论】:
-
10e9 浮点值对我来说似乎并不大。 1e5 列虽然可以。您是否考虑过使用 dask.array 和 HDF5?这些可能更适合在两个维度上进行屏蔽。
-
dask.array 和 HDF5 是否更适合 >>> 否的数据帧。列?什么是“阻塞”?
-
每个分区有多少行? read_csv 按字节数拆分,所以我希望数量很少。对于每个分区的每一列,必须存在一个单独的元数据,这使您的元数据比我以前见过的任何元数据都大——但我希望它能够工作。对于存储类似数组的 100kx100k 浮点数,我实际上推荐zarr。
-
Parquet 为每一列创建一个新的数据段。所以每一列都有不小的成本。 HDF5 或 ZArr 可以按行和按列“阻止”或分组数据。如果您有很多行和很多列,这往往会更好
标签: python dataframe parquet dask fastparquet