HDF5 のパフォーマンスと同時実行性について次の質問があります。
- HDF5 は同時書き込みアクセスをサポートしていますか?
- 並行性の考慮事項はさておき、 I/O パフォーマンスの観点から HDF5 のパフォーマンスはどうですか(圧縮率はパフォーマンスに影響しますか)?
- Python で HDF5 を使用しているため、そのパフォーマンスは Sqlite と比較してどうですか?
参考文献:
HDF5 のパフォーマンスと同時実行性について次の質問があります。
参考文献:
pandas 0.13.1 を使用するように更新
1) いいえ。 http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caeats . これを行うにはさまざまな方法があります。たとえば、さまざまなスレッド/プロセスに計算結果を書き出させてから、単一のプロセスを結合させます。
2) 保存するデータの種類、その方法、取得方法によっては、HDF5 のパフォーマンスが大幅に向上します。HDFStore
単一の配列、float データ、圧縮された (つまり、クエリを実行できる形式で保存しない) として保存すると、驚くほど高速に保存/読み取りが行われます。テーブル形式で保存しても (書き込みパフォーマンスが低下します)、書き込みパフォーマンスは非常に優れています。いくつかの詳細な比較についてこれを見ることができます(これは内部でHDFStore
使用されているものです)。http://www.pytables.org/、ここに素敵な写真があります:
(そしてPyTables 2.3以降、クエリは現在インデックス化されています)、パフォーマンスは実際にはこれよりもはるかに優れているため、質問に答えるために、何らかのパフォーマンスが必要な場合は、HDF5が最適です。
書き込み:
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。