镶木地板文件的大小是否大于字符串数据中的 csv?
Has parquet file the size greater csv in string data?
我有一个大小为 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))
更新一:
我尝试使用 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 和大小效率)存储数据 column-by-column。这些技术可以处理的数据越多,就越有效。将块大小设置为单个数字值会消除这些好处,但也会增加文件本身的开销,因为 Parquet 还存储 header 和一些元数据,例如每个列块的列统计信息。 chunk_size=1,这意味着每一行将在文件中存储 3-4 次,甚至不考虑额外的元数据 headers。
我有一个大小为 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))
更新一:
我尝试使用 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 和大小效率)存储数据 column-by-column。这些技术可以处理的数据越多,就越有效。将块大小设置为单个数字值会消除这些好处,但也会增加文件本身的开销,因为 Parquet 还存储 header 和一些元数据,例如每个列块的列统计信息。 chunk_size=1,这意味着每一行将在文件中存储 3-4 次,甚至不考虑额外的元数据 headers。