HDF5 – 并发性,压缩和I / O性能

我有关于HDF5性能和并发性的以下问题:

  1. HDF5是否支持并发写入访问?
  2. 除了并发性考虑之外,HDF5在I / O性能压缩率是否会影响性能)方面的性能如何?
  3. 由于我用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服务器呢?