python - Parquet 文件的大小是否大于字符串数据中的 csv?

标签 python pandas csv parquet pyarrow

我有一个大小等于 170kB 的 csv,当我将它们转换为 parquet 文件时,大小为 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 对文件大小有影响。如果较大,则尺寸减小。使用等于 30 的 chunksize,大小为 76kB。

最佳答案

这主要归结为使用极小的 block 大小,从而禁用 Parquet 格式的柱状性质(以及所有优点)。 Parquet 文件中的 block 是强制中断,不会对两个 block 应用优化。

鉴于 170KB 对于 Parquet 来说是一个非常小的尺寸,您根本不应该分块。通常合理的 block 大小是您的数据产生大小为 128MiB 的 block ,在某些情况下更小的 block 是有意义的,但对于大多数用例来说,一个或多个 128MiB 大小的 block 是正确的选择。

在 block 内,Parquet 应用各种压缩和编码技术来高效地(CPU 和大小效率)逐列存储数据。这些技术可以处理的数据越多,就越有效。将 block 大小设置为单个数字值会消除这些好处,但也会增加文件本身的开销,因为 Parquet 还存储标题和一些元数据,例如每个列 block 的列统计信息。使用 chunk_size=1,这意味着每一行将在文件中存储 3-4 次,甚至不考虑额外的元数据 header 。

关于python - Parquet 文件的大小是否大于字符串数据中的 csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61965485/

相关文章:

python - Scipy nnls算法没有终止容错选项

Python aiohttp + 异步 : How to execute code after loop. run_forever()

python - 需要计算连续索引的运行次数

python - Pandas 箱线图 x 轴设置

python - 将字典转换为数据帧,其中键和值都有自己的列

javascript - 嵌套的 Object.keys forEach 循环和构建合并的 JSON 对象数组的问题

java - 如何设置 csv 组件来映射字符串列表

python - 条件概率计算

python - 使用 re.split 在 python 中使用多个定界符拆分字符串(来自 python cookbook)

python - X.509 证书序列号到十六进制的转换