HDF5 – 并发性,压缩和I / O性能
我有关于HDF5性能和并发性的以下问题:
- HDF5是否支持并发写入访问?
- 除了并发性考虑之外,HDF5在I / O性能 ( 压缩率是否会影响性能)方面的性能如何?
- 由于我用Python使用HDF5,它的性能如何与Sqlite相比?
参考文献:
- http://www.sqlite.org/faq.html#q5
- lockingNFS文件系统上的sqlite文件可能吗?
- http://pandas.pydata.org/
更新为使用pandas0.13.1
1)否。http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats 。 有很多种方法可以做到这一点,比如让不同的线程/进程写出计算结果,然后再合并一个进程。
2)根据您存储的数据types,如何操作以及如何检索,HDF5可以提供更好的性能。 将数据存储在HDFStore
作为单个数组,将数据压缩(换句话说,不将其存储为允许查询的格式),将被快速存储/读取。 即使以表格格式存储(这会降低写入性能),也会提供相当不错的写入性能。 你可以看看这个一些详细的比较(这是什么HDFStore
使用的引擎盖)。 http://www.pytables.org/ ,这是一个不错的图片:
(而且从PyTable 2.3开始,查询现在被编入索引),所以perf比这更好。所以要回答你的问题,如果你想要任何types的性能,HDF5是最好的select。
写作:
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
不支持在c
级别的并行I / O,但是我不确定有多lessh5py
包装,或者它是否能和NFS搭配使用。
如果你真的想要一个高度并发的关系数据库,为什么不使用一个真正的SQL服务器呢?