Обновленный, чтобы использовать панд 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.
Я думаю, что этот вопрос, вероятно, не является конструктивным, а не вне темы, но я не могу придумать, как это должно быть сформулировано, чтобы быть на тему (я пытался и сдался). С радостью проголосуют за повторное открытие и отмену, если будут исправлены. –
Просто нашел этот вопрос, ища производительность HDF5. Я думаю, что этот вопрос полезен. Я переформулировал его и проголосовал за повторное открытие. – Datageek