HDF5-współbieżność, kompresja i wydajność we/wy [zamknięta]

Mam następujące pytania dotyczące wydajności HDF5 i współbieżności:

  1. czy HDF5 obsługuje jednoczesny dostęp do zapisu?
  2. pomijając kwestie współbieżności, w jaki sposób wydajność HDF5 pod względem wydajności I/O (czy stopień kompresji wpływa na wydajność)?
  3. ponieważ używam HDF5 z Pythonem, jak jego wydajność ma się do Sqlite?

Bibliografia:

Author: Brad Solomon, 2013-05-18

2 answers

Zaktualizowano do użycia pandas 0.13.1

1) nie. http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats . istnieją różne sposoby, aby ZROBIĆ TO , np. aby różne wątki / procesy zapisały wyniki obliczeń, a następnie połączyły jeden proces.

2) w zależności od rodzaju przechowywanych danych, sposobu ich przechowywania i sposobu pobierania, HDF5 może oferować znacznie lepszą wydajność. Przechowywanie w HDFStore jako pojedynczej tablicy, danych zmiennoprzecinkowych, skompresowanych (w innymi słowy, nie przechowując go w formacie pozwalającym na zapytania), będą przechowywane / odczytywane niesamowicie szybko. Nawet Przechowywanie w formacie tabeli (co spowalnia wydajność zapisu), zapewni całkiem dobrą wydajność zapisu. Możesz spojrzeć na to, aby uzyskać szczegółowe porównania (czyli to, co HDFStore używa pod maską). http://www.pytables.org / , tu masz ładne zdjęcie:

(a od PyTables 2.3 zapytania są teraz indeksowane), więc perf faktycznie jest znacznie lepszy niż ten Więc odpowiadając twoje pytanie, jeśli chcesz jakąkolwiek wydajność, HDF5 jest drogą do zrobienia.

Zapis:

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

Czytanie

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

A oto kod

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')

Oczywiście YMMV.

 69
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-30 15:46:57

Spójrz na pytables, mogli już zrobić dużo tej pracy dla Ciebie.

To powiedziawszy, nie jestem do końca jasne, jak porównać hdf i sqlite. {[1] } jest hierarchicznym formatem plików danych ogólnego przeznaczenia + bibliotekami, a {[2] } jest relacyjną bazą danych.

hdf obsługuje równoległe wejścia / wyjścia na poziomie c, ale nie jestem pewien, ile z tego h5py owija się i czy będzie dobrze z NFS.

Jeśli naprawdę chcesz mieć wysoce współbieżną relacyjną bazę danych, dlaczego nie wystarczy użyć prawdziwego serwera SQL?

 2
Author: tacaswell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-18 21:40:49