スーパードライ品、Pythonは、データを読み取るため千万パンダの使用とトレーニングを最適化

環境:Linuxの-cenos5

プロセッサ:31

モデル:62

モデル名:インテル(R)Xeon(R)CPU E5-2640 v2を@ 2.00GHz

CPUのMHzの:2000.066

キャッシュサイズ:20480キロバイト

メモリ:125G

 

上述したように、スタンドアロン環境では、2000Wの少なくとも1/5に低減されたトレーニングデータ容量パンダデータフォーマットに基づいて、いくつかの最適化モデルを使用して作製することができる、600Wは、トレーニング時間を増加させます。次のように特定のプログラムは以下のとおりです。

 

データは読み取りに最適化

データ行4200W、193の量は、カラムストアテーブルに格納されている点、CSVファイル形式、16ギガバイト+の合計サイズをフローティング各単精度の文字列型。データフレームを行くために、次の文を読んで:

df_train = pd.read_csv(パス、ヘッダ=なし、9月= ''、NROWS = 40000000、error_bad_lines = Falseを、デリミタ= "\ T"、lineterminator = "\ n" は、
                       keep_default_na =真)

  行数が800Wより記事NROWSを読んだとき、テストした後、総メモリは直接クラッシュスライス・データ・セットの複製に次のステップに関連80Gを超えるdf_train、直接以上1200W以下バーを読み取ることができません。まず、最適化の読みする方法を考えてみます。

na_vals = [ "\\ N"、」」、 ""、 "NULL"]
df_tmp = []
df_train = pd.DataFrame(インデックス= [ "0"]、DTYPE = np.float32)
カウント= 0
pd.read_csvにおけるチャンク(パス、ヘッダ=なし、9月= ''、チャンク= 200000、NROWS = 10000000、error_bad_lines = Falseを、デリミタ= "\ T"、lineterminator = "\ n" のために、
                         keep_default_na =真、na_values = na_vals):
    df_tmp.append(チャンク[1])
    デルチャンク
    印刷( "チャンク" + STR(カウント)+ "が格納されていました...")
    印刷( "MEM-コスト今ある:"、STR(sys.getsizeof(df_tmp)/(1))、 "MB \ N")

  

それは説明し、次の点に分けることができます

使用するための代替的na_valuesヌル値を読み出す代わりに置き換えるモードのヌル値は、すべてのデータ交換を読み取り、その後の処理時間を短縮します

使用のチャンクは、データを読み取る、read_csv()メソッドは、ファイルを読み取るためにCHUNKSIZEチャンクサイズのブロックサイズを指定することができるパラメータを有しています。異なるDFを横断すると、それはオブジェクトTextFileReader型で、直接使用されます。

循環による各読み取りブロックデータ、リストをして、一緒にスプライス。理由だけではなく、反復連結してスプライシングされていませんか?データ量が多い場合、極端な、対応する変数に割り当てられ、都度連結一時的なコピーを作成しますCONCATのみ、値のセマンティクス割り当てを使用することができますので、前に、このプロセスは、割り当てのメモリフットプリントが完了した原因は、元のデータフレームを削除高いメモリ使用量ピーク。パイソンのリストは、メモリの連続ブロック、追加のメモリオーバーヘッドに直接添加してもよいです。

各チャンクを読んだ後、すべての削除は、対応するメモリを解放します

 

データコンバージョンオプティマイザー

最適化された読みになった後、スクリプトは2000Wより多くのデータを読み取ることができ、そして以前よりも3倍のデータ量を読まされます。しかし、読み込みが完了しているこの時間は、その後の処理がまだメモリエラーが生成されます、最初のエラーがあります

df_X = pd.DataFrame(データ= df_tmp、DTYPE = np.float)

 

我々はコンストラクタパンダを経由して、読み出しデータ型変換の一覧を表示するときの理由は、二つの大きなデータフレーム/リストを生成します、与えられ、一時テーブルは、df_tmp自体右側されている、この時間制限を超えているメモリ、プログラムがクラッシュします。このセクションで与えられた以下のスキームを用いた解析を回避することができた後、

IDX = 0
私のための範囲内(LEN(df_tmp)):
    TMP = pd.DataFrame(データ= df_tmp [IDX]、DTYPE = np.float)
    df_train = pd.concat([df_train、TMP]、ignore_index = TRUE)
    デルdf_tmp [IDX]、TMP
    プリント(I)
    印刷(「残りのチャンクがある:」、カウント)
    印刷( "フレームサイズがある:"、df_train.memory_usage()の和(** 2)/(1024)、 "MB")
カウント- = 1

  

また、主テーブルdf_train各増分更新、ループを通る、ハンドルのみdf_tmpチャンクは、スプライシング中にすべてのデータの一時リストを格納し、データ変換の繰り返し。更新後すぐに、リスト内の対応するメモリを解放するために完了です。最適化の後、メモリフットプリントのこの部分は半分に

 

データ型の最適化

 

パンダサブタイプを複数有するデータの多くの種類が、それらは、例えば、データの少ない異なるバイトを表すために使用することができ、フロートタイプはfloat16、のfloat32を有し、これらのサブタイプのfloat64。これらの図は、単に記載されている使用して、このタイプのいくつかのタイプは、サブタイプとして、データを表すために使用されるビットの数の名前であることを示して2,4,8バイトです。次の表は、パンダのサブタイプのこの一般的に使用されるタイプ:

 

データ・タイプは1バイト(8ビット)を格納し使用INT8値が256(2 ^ 8)のバイナリ値を表すことができます。我々は、(0を含む)-128から127までの値を表現するために、このサブタイプを使用することができ、この手段。生データテーブルは、基本的にフロートで構成され、最適化するために、データ型の使用を考慮することが可能です。

TMP0 = pd.DataFrame(データ= df_tmp [IDX])
TMP1 = pd.DataFrame(データ= df_tmp [IDX]、DTYPE =オブジェクト)
TMP2 = pd.DataFrame(データ= df_tmp [IDX]、DTYPE = np.float)
TMP3 = pd.DataFrame(データ= df_tmp [IDX]、DTYPE = np.float32)
#プリント(「残りのチャンクがある:」、カウント数)
印刷( "フレームサイズがある:"。、df_train.memory_usage()の和(** 2)/(1024)、 "MB")

  (デフォルトのタイプSTR)を次のようにケースデータ量2W、パンダメモリフットプリント

 

 

コード変換の種類の先頭ではなく、デフォルトでは、CSV形式による初期化し、すべてのデータ・タイプのでデータフレームSTR、ストレージオーバーヘッドを読んだ後で、非常に大きな、着信120Gを読んだ後に直接16GにCSV 。ブロックと併せて読ま反復する前に、データ型の最適化の後、データ2000W(8G)は以下15G 60Gメモリフットプリントよりへの還元によって読み取られ、そしてその後の直接変換型の必要性を排除します。

 

ヒント

それは、その後のモデリングプロセス内の他の用途を持っていない場合は、それぞれの使用オブジェクトの後、手動でデータセットに最適なデータ型を読み取る時に指定した列のGCマシンをトリガー、削除、または変数の参照を削除することができます。pandas.read_csv()関数は、いくつかのパラメータは、これを行うことができます。DTYPEパラメータは、1人の列名(文字列型)を取りnumpyの値辞書オブジェクトタイプに結合辞書

 

辞書= {X:COLにおけるxのnp.float16}

df_train = pd.read_csv(パス、ヘッダ=なし、月= ''、error_bad_lines = Falseを、デリミタ= "\ T"、lineterminator = "\ n" は、
                       keep_default_na =真、コンバータ= dictの、na_vals = na_vals)

  ライブラリDASK機械学習、分散オープンソースのパンダを使用することを検討してください、あなたは、スタンドアロン環境で実行することができます

 

おすすめ

転載: www.cnblogs.com/daniumiqi/p/12111515.html