web-dev-qa-db-ja.com

HDF5-同時実行性、圧縮およびI / Oパフォーマンス

HDF5のパフォーマンスと同時実行性について次の質問があります。

  1. HDF5は同時書き込みアクセスをサポートしていますか?
  2. 同時実行の考慮事項は別として、HDF5のパフォーマンスはI/Oパフォーマンス圧縮率はパフォーマンスに影響します)に関してどのようになっていますか?
  3. 私はPythonでHDF5を使用しているので、そのパフォーマンスはSqliteと比較してどうですか?

参照:

63

pandas 0.13.1を使用するように更新

1)いいえ。 http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats 。これをdoするためのさまざまな方法があります。異なるスレッド/プロセスに計算結果を書き出させてから、単一のプロセスを結合させます。

2)保存するデータのタイプ、その方法、および取得方法に応じて、HDF5は非常に優れたパフォーマンスを提供できます。 HDFStoreに単一の配列として保存すると、圧縮された浮動小数点データ(つまり、クエリ可能な形式で保存しない)が、非常に高速に保存/読み取りされます。テーブル形式で保存すると(書き込みパフォーマンスが低下します)、非常に優れた書き込みパフォーマンスが得られます。いくつかの詳細な比較(HDFStoreが内部で使用するもの)についてこれを見ることができます。 http://www.pytables.org/ 、ここに素敵な写真があります: 

(そして、PyTables 2.3以降、クエリはインデックス化されています)、perfは実際にはこれよりもはるかに優れています。

書き込み:

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

読書

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

そして、ここにコードがあります

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

もちろん、YMMV。

76
Jeff

pytablesを調べてください。彼らはすでにあなたのためにこの脚注の多くを行っているかもしれません。

とはいえ、hdfとsqliteを比較する方法については完全には明確ではありません。 hdfは汎用の階層データファイル形式+ライブラリであり、sqliteはリレーショナルデータベースです。

hdfcレベルでの並列I/Oをサポートしますが、その量がわからないh5pyはラップするか、NFSでNiceを再生します。

高度に同時実行のリレーショナルデータベースが本当に必要な場合は、実際のSQLサーバーを使用しないでください。

2
tacaswell