我有以下关于 HDF5 性能和并发性的问题:
- HDF5 是否支持并发写访问?
- 除了并发考虑,HDF5 在I/O 性能方面的性能如何(压缩率是否会影响性能)?
- 由于我在 Python 中使用 HDF5,它的性能与 Sqlite 相比如何?
参考:
我有以下关于 HDF5 性能和并发性的问题:
参考:
更新为使用 pandas 0.13.1
1)没有。 http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats。有多种方法可以做到这一点,例如让您的不同线程/进程写出计算结果,然后让单个进程组合。
2) 根据您存储的数据类型、存储方式以及检索方式,HDF5 可以提供更好的性能。将浮点数据存储HDFStore
为单个数组,经过压缩(换句话说,不以允许查询的格式存储),存储/读取速度非常快。即使以表格格式存储(这会降低写入性能),也会提供相当好的写入性能。您可以查看一些详细的比较(这是HDFStore
在引擎盖下使用的)。http://www.pytables.org/,这是一张漂亮的照片:
(并且由于 PyTables 2.3 查询现在已编入索引),所以 perf 实际上比这要好得多所以回答你的问题,如果你想要任何类型的性能,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。
看看pytables
,他们可能已经为你做了很多这样的工作。
也就是说,我并不完全清楚如何比较 hdf 和 sqlite。 hdf
是一种通用的分层数据文件格式+库,sqlite
是一个关系数据库。
hdf
确实支持该级别的并行 I/O c
,但我不确定其中包含多少,h5py
或者它是否可以与 NFS 配合使用。
如果你真的想要一个高度并发的关系数据库,为什么不直接使用真正的 SQL 服务器呢?