python - read_table - HDF5: simultaneidad, compresión y rendimiento de E/S
read table in python (2)
Tengo las siguientes preguntas sobre el rendimiento y la concurrencia de HDF5:
- ¿Admite HDF5 el acceso de escritura concurrente?
- Dejando a un lado las consideraciones de concurrencia, ¿cómo es el rendimiento de HDF5 en términos de rendimiento de E / S (¿afectan las tasas de compresión al rendimiento)?
- Como uso HDF5 con Python, ¿cómo se compara su rendimiento con Sqlite?
Referencias
Actualizado para usar pandas 0.13.1
1) No. http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats . Hay varias maneras de hacerlo , por ejemplo, que sus diferentes hilos / procesos escriban los resultados del cálculo y luego combinen un solo proceso.
2) dependiendo del tipo de datos que almacene, cómo lo haga y cómo quiera recuperarlos, HDF5 puede ofrecer un rendimiento mucho mejor. Almacenar en un HDFStore
como una única matriz, datos flotantes, comprimidos (en otras palabras, no almacenarlos en un formato que permita realizar consultas), se almacenarán / leerán increíblemente rápido. Incluso el almacenamiento en formato de tabla (que ralentiza el rendimiento de escritura) ofrecerá un rendimiento de escritura bastante bueno. Puedes ver esto para algunas comparaciones detalladas (que es lo que HDFStore
usa debajo del capó). http://www.pytables.org/ , aquí hay una buena foto:
(y desde PyTables 2.3 las consultas ahora están indexadas), por lo tanto, perf realmente es MUCHO mejor que esto Entonces, para responder a su pregunta, si desea algún tipo de rendimiento, HDF5 es el camino a seguir.
Escritura:
In [14]: %timeit test_sql_write(df)
1 loops, best of 3: 6.24 s per loop
In [15]: %timeit test_hdf_fixed_write(df)
1 loops, best of 3: 237 ms per loop
In [16]: %timeit test_hdf_table_write(df)
1 loops, best of 3: 901 ms per loop
In [17]: %timeit test_csv_write(df)
1 loops, best of 3: 3.44 s per loop
Leyendo
In [18]: %timeit test_sql_read()
1 loops, best of 3: 766 ms per loop
In [19]: %timeit test_hdf_fixed_read()
10 loops, best of 3: 19.1 ms per loop
In [20]: %timeit test_hdf_table_read()
10 loops, best of 3: 39 ms per loop
In [22]: %timeit test_csv_read()
1 loops, best of 3: 620 ms per loop
Y aquí está el código
import sqlite3
import os
from pandas.io import sql
In [3]: df = DataFrame(randn(1000000,2),columns=list(''AB''))
<class ''pandas.core.frame.DataFrame''>
Int64Index: 1000000 entries, 0 to 999999
Data columns (total 2 columns):
A 1000000 non-null values
B 1000000 non-null values
dtypes: float64(2)
def test_sql_write(df):
if os.path.exists(''test.sql''):
os.remove(''test.sql'')
sql_db = sqlite3.connect(''test.sql'')
sql.write_frame(df, name=''test_table'', con=sql_db)
sql_db.close()
def test_sql_read():
sql_db = sqlite3.connect(''test.sql'')
sql.read_frame("select * from test_table", sql_db)
sql_db.close()
def test_hdf_fixed_write(df):
df.to_hdf(''test_fixed.hdf'',''test'',mode=''w'')
def test_csv_read():
pd.read_csv(''test.csv'',index_col=0)
def test_csv_write(df):
df.to_csv(''test.csv'',mode=''w'')
def test_hdf_fixed_read():
pd.read_hdf(''test_fixed.hdf'',''test'')
def test_hdf_table_write(df):
df.to_hdf(''test_table.hdf'',''test'',format=''table'',mode=''w'')
def test_hdf_table_read():
pd.read_hdf(''test_table.hdf'',''test'')
Por supuesto, YMMV.
Mire en las pytables
, es posible que ya hayan hecho mucho de esta tarea por usted.
Dicho esto, no estoy del todo claro sobre cómo comparar hdf y sqlite. hdf
es un formato de archivo jerárquico de datos de propósito general + libraries y sqlite
es una base de datos relacional.
hdf
es compatible con E / S paralelas en el nivel c
, pero no estoy seguro de cuánto de esa h5py
envuelve o si funcionará bien con NFS.
Si realmente desea una base de datos relacional altamente concurrente, ¿por qué no simplemente usar un servidor SQL real?