存储在 bcolz 中时数据大小过大
data size blows out when storing in bcolz
我有一个包含约 7M 行和 3 列的数据集,2 个数字和 1 个由约 20M 不同的字符串 uuid 组成。数据作为csv文件大约需要3G,而castra可以将其存储在大约2G中。
我想用这些数据测试 bcolz。
我试过了
odo(dask.dataframe.from_castra('data.castra'), 'data.bcolz')
在耗尽磁盘上的 inode 之前生成了约 70G 的数据
和崩溃。
将此类数据集导入 bcolz 的推荐方法是什么?
来自 bcolz mailing list 上的 Killian Mie:
通过 pandas.read_csv()
分块读取 csv,将字符串列从 Python object dtype 转换为固定长度的 numpy dtype,例如 'S20',然后作为 numpy 数组追加到 ctable .
此外,在创建 ctable 时设置 chunklen=1000000
(或类似的),这将避免在 /data 文件夹下创建数百个文件(虽然可能不是压缩的最佳选择)
上面的 2 个步骤对我来说效果很好(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)
我有一个包含约 7M 行和 3 列的数据集,2 个数字和 1 个由约 20M 不同的字符串 uuid 组成。数据作为csv文件大约需要3G,而castra可以将其存储在大约2G中。 我想用这些数据测试 bcolz。
我试过了
odo(dask.dataframe.from_castra('data.castra'), 'data.bcolz')
在耗尽磁盘上的 inode 之前生成了约 70G 的数据 和崩溃。
将此类数据集导入 bcolz 的推荐方法是什么?
来自 bcolz mailing list 上的 Killian Mie:
通过 pandas.read_csv()
分块读取 csv,将字符串列从 Python object dtype 转换为固定长度的 numpy dtype,例如 'S20',然后作为 numpy 数组追加到 ctable .
此外,在创建 ctable 时设置 chunklen=1000000
(或类似的),这将避免在 /data 文件夹下创建数百个文件(虽然可能不是压缩的最佳选择)
上面的 2 个步骤对我来说效果很好(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)