1

dd.from_bcolz() が呼び出されるとすぐに処理を開始するのはなぜですか (N 列が増え、文字列型の列があると大きくなります)。

そして、 dd.read_hdf() は、呼び出されたときに多くの処理を行いませんが、dask.dataframe が使用された場合にのみ、read_hdf() は HDF5 チャンクを読み取り、チャンクごとに処理します...

hdf5テーブルが最大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) が成長すると、さらに悪化します。

4

1 に答える 1

0

今日書かれているように、from_bcolzオブジェクトの dtype 列を自動的に分類します。したがって、すべてのオブジェクト dtype 列を完全に読み取り、uniqueそれらを呼び出しています。を設定することで、これをオフにすることができますcategorize=False

この動作を変更する必要があると思われる場合は、github の問題を提起してください。

于 2016-07-29T01:15:06.517 に答える