dask.dataframe.from_bcolz() 立即开始处理
dask.dataframe.from_bcolz() starts to process immediately
我想知道为什么 dd.from_bcolz() 在被调用时立即开始做一些处理(当 N 列增加并且有字符串类型列时会增长很多)。
而 dd.read_hdf() 在被调用时不会做太多处理,但只有在使用 dask.dataframe 时 - 然后 read_hdf() 逐块读取和处理 HDF5.. .
我喜欢 read_hdf 现在的工作方式,唯一的问题是 hdf5 table 不能超过 ~1200 列,并且数据框不支持数组列。而且hdf5格式毕竟不是基于列的...
In [1]: import dask.dataframe as dd
In [2]: import pandas as pd
In [3]: import bcolz, random
In [4]: import numpy as np
In [5]: N = int(1e7)
In [6]: int_col = np.linspace(0, 1, N)
In [7]: ct_disk = bcolz.fromiter(((i,i) for i in range(N)), dtype="i8,i8",\
...: count=N, rootdir=r'/mnt/nfs/ct_.bcolz')
In [8]: for i in range(10): ct_disk.addcol(int_col)
In [9]: import dask.dataframe as dd
In [10]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 8 ms, sys: 16 ms, total: 24 ms
Wall time: 32.6 ms
Out[10]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
In [11]: str_col= [''.join(random.choice('ABCD1234') for _ in range(5)) for i in range(int(N/10))]*10
In [12]: ct_disk.addcol(str_col, dtype='S5')
In [13]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 2.36 s, sys: 56 ms, total: 2.42 s
Wall time: 2.44 s
Out[13]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
In [14]: for i in range(10): ct_disk.addcol(str_col, dtype='S5')
In [15]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 25.3 s, sys: 511 ms, total: 25.8 s
Wall time: 25.9 s
Out[15]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
当 N (nrows) 长大时,情况会变得更糟。
看起来像今天写的那样from_bcolz
自动对对象数据类型列进行分类。所以它正在全面读取所有对象 dtype 列并在它们上调用 unique
。您可以通过设置 categorize=False
来关闭此功能。
如果您认为应该更改此行为,请提出 github 问题。
我想知道为什么 dd.from_bcolz() 在被调用时立即开始做一些处理(当 N 列增加并且有字符串类型列时会增长很多)。
而 dd.read_hdf() 在被调用时不会做太多处理,但只有在使用 dask.dataframe 时 - 然后 read_hdf() 逐块读取和处理 HDF5.. .
我喜欢 read_hdf 现在的工作方式,唯一的问题是 hdf5 table 不能超过 ~1200 列,并且数据框不支持数组列。而且hdf5格式毕竟不是基于列的...
In [1]: import dask.dataframe as dd
In [2]: import pandas as pd
In [3]: import bcolz, random
In [4]: import numpy as np
In [5]: N = int(1e7)
In [6]: int_col = np.linspace(0, 1, N)
In [7]: ct_disk = bcolz.fromiter(((i,i) for i in range(N)), dtype="i8,i8",\
...: count=N, rootdir=r'/mnt/nfs/ct_.bcolz')
In [8]: for i in range(10): ct_disk.addcol(int_col)
In [9]: import dask.dataframe as dd
In [10]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 8 ms, sys: 16 ms, total: 24 ms
Wall time: 32.6 ms
Out[10]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
In [11]: str_col= [''.join(random.choice('ABCD1234') for _ in range(5)) for i in range(int(N/10))]*10
In [12]: ct_disk.addcol(str_col, dtype='S5')
In [13]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 2.36 s, sys: 56 ms, total: 2.42 s
Wall time: 2.44 s
Out[13]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
In [14]: for i in range(10): ct_disk.addcol(str_col, dtype='S5')
In [15]: %time dd.from_bcolz(r'/mnt/nfs/ct_.bcolz', chunksize=1000000, lock=False)
CPU times: user 25.3 s, sys: 511 ms, total: 25.8 s
Wall time: 25.9 s
Out[15]: dd.DataFrame<from_bc..., npartitions=10, divisions=(0, 1000000, 2000000, ..., 9000000, 9999999)>
当 N (nrows) 长大时,情况会变得更糟。
看起来像今天写的那样from_bcolz
自动对对象数据类型列进行分类。所以它正在全面读取所有对象 dtype 列并在它们上调用 unique
。您可以通过设置 categorize=False
来关闭此功能。
如果您认为应该更改此行为,请提出 github 问题。