パンダ、hdf5を使用してETLツールキットを構築しようとしています。
私の計画は
- mysqlからDataFrameにテーブルを抽出します。
- このDataFrameをHDFStoreに配置します。
しかし、ステップ2を実行しているときに、データフレームを*.h5ファイルに入れるのに時間がかかりすぎることに気付きました。
- ソースmysqlサーバーのテーブルのサイズ:498MB
- 52列
- 924,624レコード
- データフレームを内部に入れた後の*.h5ファイルのサイズ:513MB
- 'put'操作のコストは849.345677137秒です
私の質問は次のとおり
です。今回の費用は通常ですか?
それを速くする方法はありますか?
アップデート1
ありがとうジェフ
私のコードはとてもシンプルです:
extract_store = HDFStore('extract_store.h5')
extract_store ['df_staff'] = df_staff- 'ptdump -av file.h5'を試行するとエラーが発生しましたが、このh5ファイルからデータフレームオブジェクトをロードできました。
Tables.exceptions.HDF5ExtError:HDF5エラーバックトレース
H5Fopenのファイル"../../../src/H5F.c"、行1512、
ファイルを開くことができませんファイル "../../../src/H5F.c"、行1307、H5F_open
スーパーブロックファイル"../../../src/H5Fsuper.c"、305行目を読み取ることができません。H5F_super_readで
ファイル署名ファイル"../../../src/H5Fsuper.c"が見つかりません。 153行目、H5F_locate_signature
で有効なファイル署名が見つかりませんHDF5エラーバックトレースの終了
ファイル'extract_store.h5'を開く/作成できません
- その他の情報:
- パンダバージョン: '0.10.0'
- os:ubuntuサーバー10.04 x86_64
- CPU:8 * Intel(R)Xeon(R)CPU X5670 @ 2.93GHz
- MemTotal:51634016 kB
パンダを0.10.1-devに更新して、再試行します。
アップデート2
- パンダを「0.10.1.dev-6e2b6ea」に更新しました
- しかし、時間コストは減少しませんでした。今回は884.15秒かかります。
- 'ptdump-avfile.h5'の出力は次のとおりです。
/(RootGroup)'' /._v_attrs(AttributeSet)、4つの属性: [CLASS:='GROUP'、 PYTABLES_FORMAT_VERSION:= '2.0'、 タイトル:=''、 バージョン:= '1.0'] / df_bugs(グループ)'' /df_bugs._v_attrs(AttributeSet)、12個の属性: [CLASS:='GROUP'、 タイトル:=''、 バージョン:= '1.0'、 axis0_variety:='通常'、 axis1_variety:='通常'、 block0_items_variety:='通常'、 block1_items_variety:='通常'、 block2_items_variety:='通常'、 nblocks:= 3、 ndim:= 2、 pandas_type:='フレーム'、 pandas_version:= '0.10.1'] / df_bugs / axis0(Array(52、))'' アトム:= StringAtom(itemsize = 19、shape =()、dflt ='') maindim:= 0 フレーバー:='numpy' byteorder:='無関係' チャンクシェイプ:=なし /df_bugs/axis0._v_attrs(AttributeSet)、7つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 種類:='文字列'、 名前:=なし、 転置:= True] / df_bugs / axis1(Array(924624、))'' アトム:= Int64Atom(shape =()、dflt = 0) maindim:= 0 フレーバー:='numpy' byteorder:='少し' チャンクシェイプ:=なし /df_bugs/axis1._v_attrs(AttributeSet)、7つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 種類:='整数'、 名前:=なし、 転置:= True] / df_bugs / block0_items(Array(5、))'' アトム:= StringAtom(itemsize = 12、shape =()、dflt ='') maindim:= 0 フレーバー:='numpy' byteorder:='無関係' チャンクシェイプ:=なし /df_bugs/block0_items._v_attrs(AttributeSet)、7つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 種類:='文字列'、 名前:=なし、 転置:= True] / df_bugs / block0_values(Array(924624、5))'' アトム:= Float64Atom(shape =()、dflt = 0.0) maindim:= 0 フレーバー:='numpy' byteorder:='少し' チャンクシェイプ:=なし /df_bugs/block0_values._v_attrs(AttributeSet)、5つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 転置:= True] / df_bugs / block1_items(Array(19、))'' アトム:= StringAtom(itemsize = 19、shape =()、dflt ='') maindim:= 0 フレーバー:='numpy' byteorder:='無関係' チャンクシェイプ:=なし /df_bugs/block1_items._v_attrs(AttributeSet)、7つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 種類:='文字列'、 名前:=なし、 転置:= True] / df_bugs / block1_values(Array(924624、19))'' アトム:= Int64Atom(shape =()、dflt = 0) maindim:= 0 フレーバー:='numpy' byteorder:='少し' チャンクシェイプ:=なし /df_bugs/block1_values._v_attrs(AttributeSet)、5つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 転置:= True] / df_bugs / block2_items(Array(28、))'' アトム:= StringAtom(itemsize = 18、shape =()、dflt ='') maindim:= 0 フレーバー:='numpy' byteorder:='無関係' チャンクシェイプ:=なし /df_bugs/block2_items._v_attrs(AttributeSet)、7つの属性: [クラス:='配列'、 フレーバー:='numpy'、 タイトル:=''、 バージョン:= '2.3'、 種類:='文字列'、 名前:=なし、 転置:= True] / df_bugs / block2_values(VLArray(1、))'' アトム=ObjectAtom() byteorder='無関係' nrows = 1 フレーバー='numpy' /df_bugs/block2_values._v_attrs(AttributeSet)、5つの属性: [クラス:='VLARRAY'、 PSEUDOATOM:='オブジェクト'、 タイトル:=''、 バージョン:= '1.3'、 転置:= True]
- 以下のコードを試しましたが(パラメータ'table'がTrueの状態でデータフレームをhdfstoreに配置)、代わりにエラーが発生しました。Pythonのデータ時間タイプがサポートされていないようです。
例外:タイプ'datetime.datetime'の正しいアトムタイプ->[dtype->object]オブジェクトが見つかりませんlen()がありません
アップデート3
ジェフに感謝します。遅れて申し訳ありません。
- テーブル。バージョン:「2.4.0」。
- はい、884秒はmysqlからのプル操作なしのプット操作コストのみです
- データフレームの行(df.ix [0]):
bug_id 1 185に割り当てられました bug_file_locなし bug_severityクリティカル bug_statusclosed Creation_ts 1998-05-06 21:27:00 delta_ts 2012-05-09 14:41:41 short_desc2つのカーソル。 host_op_sys不明 guest_op_sys不明 優先度P3 rep_platform IA32 レポーター56 product_id 7 category_id 983 component_id 12925 解像度が修正されました target_milestone ws1 qa_contact 412 status_whiteboard 投票0 キーワードSR lastdiffed 2012-05-09 14:41:41 確認済み1 reporter_accessible 1 cclist_accessible 1 推定時間0.00 残り時間0.00 締め切りなし エイリアスなし found_in_product_id 0 found_in_version_id 0 found_in_phase_id 0 cf_typeの欠陥 cf_reported_by開発 cf_attempted NaN cf_failed NaN cf_public_summary cf_doc_impact 0 cf_security 0 cf_build NaN cf_branch cf_change NaN cf_test_id NaN cf_regression不明 cf_reviewer 0 cf_on_hold 0 cf_public_severity --- cf_i18n_impact 0 cf_etaなし cf_bug_source --- cf_vissなし 名前:0、長さ:52
- データフレームの画像(ipythonノートブックで「df」と入力するだけ):
Int64Index:924624エントリ、0〜924623 データ列: bug_id924624非null値 Assigned_to924624非null値 bug_file_loc427318非null値 bug_severity924624非null値 bug_status924624非null値 Creation_ts924624非null値 delta_ts924624非null値 short_desc924624非null値 host_op_sys924624非null値 guest_op_sys924624非null値 優先度924624null以外の値 rep_platform924624非null値 レポーター924624非ヌル値 product_id924624非null値 category_id924624非null値 component_id924624非null値 解像度924624null以外の値 target_milestone924624非null値 qa_contact924624非null値 status_whiteboard924624非null値 投票924624null以外の値 キーワード924624null以外の値 lastdiffed924509非null値 これまでに確認された924624非null値 reporter_accessible924624非null値 cclist_accessible924624非null値 Estimated_time924624非null値 残りの時間924624null以外の値 期限0のnull以外の値 エイリアス0のnull以外の値 found_in_product_id924624非null値 found_in_version_id924624非null値 found_in_phase_id924624非null値 cf_type924624非null値 cf_reported_by924624非null値 cf_attempted89622非null値 cf_failed89587非null値 cf_public_summary510799非null値 cf_doc_impact924624非null値 cf_security924624非null値 cf_build327460非null値 cf_branch614929非null値 cf_change300612非null値 cf_test_id12610非null値 cf_regression924624非null値 cf_reviewer924624非null値 cf_on_hold924624非null値 cf_public_severity924624非null値 cf_i18n_impact924624非null値 cf_eta3910非null値 cf_bug_source924624非null値 cf_viss725非null値 dtypes:float64(5)、int64(19)、object(28)
- 'convert_objects()'の後:
dtypes:datetime64 [ns](2)、float64(5)、int64(19)、object(26)
- 変換されたデータフレームをhdfstoreのコストに入れる:749.50秒:)
- 'object' dtypesの数を減らすことが、時間コストを削減するための鍵のようです。
- 変換されたデータフレームをパラメータ'table'がtrueのhdfstoreに入れると、それでもそのエラーが返されます
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self、axes、obj、validate 、nan_rep、data_columns、min_itemsize、** kwargs) 2203レイズ (例外)を除く2204、詳細: -> 2205 raise Exception("正しいアトムタイプが見つかりません->[dtype->%s]%s"%(b.dtype.name、str(detail))) 2206 j + = 1 2207 例外:タイプ'datetime.datetime'の正しいアトムタイプ->[dtype->object]オブジェクトが見つかりませんlen()がありません
- 日時列なしでデータフレームを配置しようとしています
アップデート4
- mysqlには、datetime型の4つの列があります。
- Creation_ts
- delta_ts
- lastdiffed
- 締め切り
convert_objects()を呼び出した後:
- Creation_ts:
タイムスタンプ:1998-05-06 21:27:00
- delta_ts:
タイムスタンプ:2012-05-09 14:41:41
- lastdiffed
datetime.datetime(2012、5、9、14、41、41)
- 'convert_objects'の呼び出しの前後に関係なく、期限は常にNoneです。
なし
- 列「lastdiff」なしでデータフレームを配置すると、691.75秒かかります
- 列'lastdiff'なしでデータフレームを配置し、param'table'をTrueに設定すると、新しいエラーが発生しました。
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self、axes、obj、validate 、nan_rep、data_columns、min_itemsize、** kwargs) 2203レイズ (例外)を除く2204、詳細: -> 2205 raise Exception("正しいアトムタイプが見つかりません->[dtype->%s]%s"%(b.dtype.name、str(detail))) 2206 j + = 1 2207 例外:タイプ'Decimal'の正しいアトムタイプ->[dtype->object]オブジェクトが見つかりませんlen()がありません
- 列のタイプ'estimated_time'、'remaining_time'、'cf_viss'はmysqlでは'decimal'です
アップデート5
- 以下のコードによって、これらの「decimal」タイプの列を「float」タイプに変換しました。
no_diffed_converted_df_bugs.estimated_time = no_diffed_converted_df_bugs.estimated_time.map(float)
- そして今、時間コストは372.84秒です
- しかし、「テーブル」バージョンのパッティングでもエラーが発生しました。
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self、axes、obj、validate 、nan_rep、data_columns、min_itemsize、** kwargs) 2203レイズ (例外)を除く2204、詳細: -> 2205 raise Exception("正しいアトムタイプが見つかりません->[dtype->%s]%s"%(b.dtype.name、str(detail))) 2206 j + = 1 2207 例外:タイプ'datetime.date'の正しいアトムタイプ->[dtype->object]オブジェクトが見つかりませんlen()がありません