環境: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機械学習、分散オープンソースのパンダを使用することを検討してください、あなたは、スタンドアロン環境で実行することができます