HDF5-параллелизм, сжатие и производительность ввода-вывода [закрыто]
У меня есть следующие вопросы о производительности HDF5 и параллелизме:
- поддерживает ли HDF5 параллельный доступ на запись?
- соображения параллелизма в сторону, как производительность HDF5 с точки зрения производительность ввода/вывода (не степень сжатия влияет на производительность)?
- поскольку я использую HDF5 с Python, как его производительность сравнивается с На SQLite?
ссылки:
2 ответа:
обновлено для использования pandas 0.13.1
1) Нет. http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats. существуют различные способы do это, например, ваши разные потоки / процессы выписывают результаты вычислений, а затем объединяют один процесс.
2) в зависимости от типа данных, которые вы храните, как вы это делаете, и как вы хотите получить, HDF5 может предложить значительно более высокую производительность. Хранение в
HDFStore
как единый массив, данные float, сжатые (другими словами, не хранящие его в формате, который позволяет запрашивать), будут храниться/считываться удивительно быстро. Даже хранение в формате таблицы (что замедляет производительность записи), будет предлагать довольно хорошую производительность записи. Вы можете посмотреть на это для некоторых подробных сравнений (что такое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
поддерживает параллельный ввод / вывод вc
уровне, но я не уверен, сколько из этогоh5py
обертывания или если он будет хорошо играть с NFS.если вы действительно хотите сильно параллельная реляционная база данных, почему бы просто не использовать реальный SQL server?