在bcolz存储时,数据大小会爆炸

时间:2016-02-26 12:34:22

标签: python blaze bcolz

我有一个约7M行和3列的数据集,2个数字和1个由~20M不同的字符串uuids组成。数据大约需要3G作为csv文件,而castra可以将其存储在2G左右。 我想用这些数据测试bcolz。

我试过

odo(dask.dataframe.from_castra('data.castra'), 'data.bcolz')

在耗尽磁盘上的inode之前生成~70G的数据 和崩溃。

将这样的数据集导入bcolz的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

来自Killian Mie bcolz mailing list

通过pandas.read_csv()以块的形式读取csv,将字符串列从Python对象dtype转换为修复长度numpy dtype,比如'S20',然后将numpy数组追加到ctable。

此外,在ctable创建时设置chunklen=1000000(或类似),这将避免在/ data文件夹下创建数百个文件(尽管可能不是最佳压缩)

上述两个步骤对我来说效果很好(2000万行,40-60列)。

试试这个:

df0 = ddf.from_castra("data.castra")
df = odo.odo(df0, pd.DataFrame)
names = df.columns.tolist()
types = ['float32', 'float32', 'S20']  # adjust 'S20' to your max string length needs
cols = [bcolz.carray(df[c].values, dtype=dt) for c, dt in zip(names, types)]

ct = bcolz.zeros(0, dtype=np.dtype(zip(names, types)), 
                    mode='w', chunklen=1000000, 
                    rootdir="data.bcolz")
ct.append(cols)