Pandas admite múltiples formatos de almacenamiento. En este artículo, probaremos y compararemos la velocidad de lectura, la velocidad de escritura y el tamaño de Pandas Dataframe en diferentes formatos de almacenamiento.
Crear un marco de datos de prueba
Primero cree un marco de datos Pandas de prueba que contenga diferentes tipos de datos.
import pandas as pd
import random
import string
import numpy as np
# Config DF
df_length= 10**6
start_date= '2023-01-01'
all_string= list(string.ascii_letters + string.digits)
string_length= 10**1
min_number= 0
max_number= 10**3
# Create Columns
date_col= pd.date_range(start= start_date, periods= df_length, freq= 'H')
str_col= [''.join(np.random.choice(all_string, string_length)) for i in range(df_length)]
float_col= np.random.rand(df_length)
int_col= np.random.randint(min_number,max_number, size = df_length)
# Create DataFrame
df= pd.DataFrame({'date_col' : date_col,
'str_col' : str_col,
'float_col' : float_col,
'int_col' : int_col})
df.info()
df.head()
almacenado en un formato diferente
A continuación, cree funciones de prueba para leer y escribir en diferentes formatos.
import time
import os
def check_read_write_size(df, file_name, compression= None) :
format= file_name.split('.')[-1]
# Write
begin= time.time()
if file_name.endswith('.csv') : df.to_csv(file_name, index= False, compression= compression)
elif file_name.endswith('.parquet') : df.to_parquet(file_name, compression= compression)
elif file_name.endswith('.pickle') : df.to_pickle(file_name, compression= compression)
elif file_name.endswith('.orc') : df.to_orc(file_name)
elif file_name.endswith('.feather') : df.to_feather(file_name)
elif file_name.endswith('.h5') : df.to_hdf(file_name, key= 'df')
write_time= time.time() - begin
# Read
begin= time.time()
if file_name.endswith('.csv') : pd.read_csv(file_name, compression= compression)
elif file_name.endswith('.parquet') : pd.read_parquet(file_name)
elif file_name.endswith('.pickle') : pd.read_pickle(file_name, compression= compression)
elif file_name.endswith('.orc') : pd.read_orc(file_name)
elif file_name.endswith('.h5') : pd.read_hdf(file_name)
read_time= time.time() - begin
# File Size
file_size_mb = os.path.getsize(file_name) / (1024 * 1024)
return [format, compression, read_time, write_time, file_size_mb]
Luego ejecute la función y almacene el resultado en otro Pandas Dataframe.
test_case= [
['df.csv','infer'],
['df.csv','gzip'],
['df.pickle','infer'],
['df.pickle','gzip'],
['df.parquet','snappy'],
['df.parquet','gzip'],
['df.orc','default'],
['df.feather','default'],
['df.h5','default'],
]
result= []
for i in test_case :
result.append(check_read_write_size(df, i[0], compression= i[1]))
result_df= pd.DataFrame(result, columns= ['format','compression','read_time','write_time','file_size'])
result_df
Resultados de la prueba
Los gráficos y tablas siguientes son los resultados de las pruebas.
Hacemos un análisis simple de los resultados de la prueba.
CSV
- Tamaño máximo de archivo sin comprimir
- El tamaño comprimido es pequeño, pero no el más pequeño.
- Las velocidades de lectura y escritura de CSV son las más lentas
Pepinillo
- se comportó promedio
- Pero la velocidad de escritura por compresión es la más lenta.
Pluma
La velocidad de lectura y escritura más rápida, el tamaño del archivo también es medio, muy medio
ORCO
- El más pequeño de todos los formatos.
- Velocidades de lectura y escritura muy rápidas, casi las más rápidas.
Parquet
En general, rápido y muy pequeño, pero no el más rápido ni el más pequeño.
Resumir
A juzgar por los resultados, ¿deberíamos usar ORC o Feather en lugar de CSV?
"Depende de tu sistema".
Si estás haciendo algunos proyectos en solitario, definitivamente tiene sentido utilizar el formato más rápido o más pequeño posible.
Pero la mayoría de las veces tenemos que trabajar con otros. Entonces, hay más factores que la velocidad y el tamaño.
El CSV sin comprimir puede ser lento y grande, pero cuando es necesario enviar los datos a otro sistema, es muy fácil.
Como formato tradicional de procesamiento de big data (de Hive), ORC es el mejor para optimizar la velocidad y el tamaño. Parquet es más grande y más lento que ORC, pero logra el mejor equilibrio entre velocidad y tamaño, y hay muchos ecosistemas que lo admiten. , para que pueda elegir Parquet primero cuando necesite procesar archivos grandes.
https://avoid.overfit.cn/post/387acc48c7dd42a49f7bec90cc6d09ae
Por Chanon Krittapholchai