[英]Has parquet file the size greater csv in string data?
我有一个大小等于 170kB 的 csv,当我将它们转换为镶木地板文件时,大小为 1.2MB。 数据结构是 12 列的字符串。
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
csv_filename = "../files/test.csv"
parquet_filename = '../files/sample.parquet'
chunksize = 1
pqwriter = None
for i, df in enumerate(pd.read_csv(csv_filename, delimiter='_;_', chunksize=chunksize)):
#df = df.astype(str)
table = pa.Table.from_pandas(df=df)
# for the first chunk of records
if i == 0:
# create a parquet write object giving it an output file
pqwriter = pq.ParquetWriter(parquet_filename, table.schema, compression='gzip', use_dictionary=False)
pqwriter.write_table(table)
# close the parquet writer
if pqwriter:
pqwriter.close()
df = pd.read_parquet(parquet_filename)
print(df.memory_usage(deep=True))
更新 1:我尝试使用fastparquet
,大小为 933kB。
for i, df in enumerate(pd.read_csv(csv_filename, delimiter='_;_', chunksize=chunksize)):
fastparquet.write(parquet_filename, df, compression='gzip', append=True)
更新 2:参数chunksize
对文件大小有影响。 如果更大,则尺寸会减小。 使用chunksize
等于 30,大小为 76kB。
这主要归结为使用极小的块大小,从而禁用 Parquet 格式的柱状性质(以及所有好处)。 Parquet 文件中的块是强制中断,不会对两个块进行优化。
鉴于 170KB 对于 Parquet 来说是一个非常小的大小,您根本不应该分块。 通常,合理的块大小是您的数据产生 128MiB 大小的块,在某些情况下更小的块是有意义的,但对于大多数用例来说,单个块或 128MiB 大小的块是正确的选择。
在一个块内,Parquet 应用各种压缩和编码技术来有效地(CPU 和大小效率)来逐列存储数据。 这些技术越有效,它们可以处理的数据越多。 将块大小设置为单个数字值会消除这些好处,但也会增加文件本身的开销,因为 Parquet 还存储 header 和一些元数据,如每列块的列统计信息。 当 chunk_size=1 时,这意味着每一行将在文件中存储 3-4 次,甚至不考虑额外的元数据头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.