sqlite HDF 5-并发、压缩和I/O性能[已关闭]

aelbi1ox  于 2023-08-06  发布在  SQLite
关注(0)|答案(2)|浏览(134)

**已关闭。**此问题为off-topic。它目前不接受回答。
希望改进此问题?Update the question,所以Stack Overflow的on-topic

10年前就关门了。
Improve this question
我对HDF 5性能和并发性有以下问题:

  1. HDF 5是否支持并发写访问?
    1.先不考虑并发性,HDF 5在I/O性能方面的表现如何(压缩率是否会影响性能)?
    1.由于我使用HDF 5和Python,它的性能与Sqlite相比如何?
    参考文献:
brc7rcf0

brc7rcf01#

更新为使用pandas 0.13.1
1.不可以。http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats。让不同的线程/进程写出计算结果,然后让单个进程合并。
1.根据您存储的数据类型、存储方式以及检索方式,HDF 5可以提供更好的性能。在HDFStore中作为单个数组存储浮点数据,压缩(换句话说,不以允许查询的格式存储),将以惊人的速度存储/读取。即使以表格格式存储(这会降低写入性能),也会提供相当好的写入性能。您可以查看这一点以进行一些详细的比较(这是HDFStore在后台使用的)。http://www.pytables.org/,这里有一个很好的图片:x1c 0d1x的数据
从PyTables 2.3开始,查询现在被索引了,所以性能实际上比这好得多。
为了回答你的问题,如果你想要任何类型的性能,HDF 5是要走的路。
写作:

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。

wlwcrazw

wlwcrazw2#

看看pytables,他们可能已经为你做了很多这样的跑腿工作。
也就是说,我不完全清楚如何比较hdf和sqlite。hdf是一个通用的分层数据文件格式+库,sqlite是一个关系数据库。
hdf确实支持c级别的并行I/O,但我不确定h5py封装了多少,也不确定它是否能很好地处理NFS。
如果你真的想要一个高并发的关系数据库,为什么不使用真正的SQL服务器呢?

相关问题