2013-05-18 3 views
45

У меня есть следующие вопросы о производительности HDF5 и параллелизм:HDF5 - параллелизм, сжатие и производительность ввода/вывода

  1. ли HDF5 поддержка одновременного доступа записи?
  2. Вопросы параллелизма в стороне, как производительность HDF5 в терминах Производительность ввода/вывода (составляет Коэффициенты сжатия влияют на производительность)?
  3. Поскольку я использую HDF5 с Python, как его производительность сравнивается с Sqlite?

Ссылки:

+0

Я думаю, что этот вопрос, вероятно, не является конструктивным, а не вне темы, но я не могу придумать, как это должно быть сформулировано, чтобы быть на тему (я пытался и сдался). С радостью проголосуют за повторное открытие и отмену, если будут исправлены. –

+13

Просто нашел этот вопрос, ища производительность HDF5. Я думаю, что этот вопрос полезен. Я переформулировал его и проголосовал за повторное открытие. – Datageek

ответ

63

Обновленный, чтобы использовать панд 0.13.1

1) № http://pandas.pydata.org/pandas-docs/dev/io.html#notes-caveats. Существуют различные способы для do это, например. ваши разные потоки/процессы выписывают результаты вычислений, а затем объединяют один процесс.

2) В зависимости от типа данных, которые вы храните, как вы это делаете и как вы хотите получить, HDF5 может предложить значительно лучшую производительность. Сохраняя в HDFStore как единый массив, данные с плавающей запятой, сжатые (другими словами, не сохраняя их в формате, который позволяет запрашивать), будут быстро сохраняться/считываться. Даже сохранение в формате таблицы (что замедляет производительность записи), обеспечит неплохую производительность записи. Вы можете посмотреть на это для некоторых подробных сравнений (это то, что HDFStore использует под капотом). http://www.pytables.org/, вот хорошая картина:

(и так PyTables 2.3 запросы теперь индексируется), поэтому перфорация на самом деле намного лучше, чем это Так, чтобы ответить на ваш вопрос, если вы хотите какой-либо производительности, 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.

+0

Очень интересный Джефф! (Интересно, можно ли задать этот вопрос по теме ...) –

+0

Какие СУБД вы используете? Сюжет показывает PostgreSQL, но код говорит sqlite3. –

+0

тайминги были из локального '' sqlite'' на основе файлов (вкл. На python). Сюжет был оригинальным, выполненным ребятами '' PyTables'', и я думаю, что использовал '' postgresql'' (это было РЕАЛЬНОЕ исследование, очень подробное). – Jeff

2

Посмотрите в pytables, они, возможно, уже сделал много этой беготней для вас.

Тем не менее, я не совсем понимаю, как сравнить hdf и sqlite. hdf - это формат файлов иерархических данных общего назначения + библиотеки, а sqlite - реляционная база данных.

hdf поддерживает параллельный ввод-вывод на уровне c, но я не уверен, сколько из этого h5py обертывает или будет неплохо играть с NFS.

Если вы действительно хотите иметь высокую параллельную реляционную базу данных, почему бы просто не использовать настоящий SQL-сервер?

Смежные вопросы