私は疑問に思っていました...たとえば、400MBのcsvファイルをpandasデータフレームに(read_csvまたはread_tableを使用して)読み取っている場合、これに必要なメモリ量を推測する方法はありますか? データフレームとメモリの感覚をつかもうとしているだけです...
7 に答える
議論にもう少しデータを持ち込むと思いました。
この問題について一連のテストを実行しました。
pythonresource
パッケージを使用して、プロセスのメモリ使用量を取得しました。
そして、csv をStringIO
バッファーに書き込むことで、そのサイズをバイト単位で簡単に測定できました。
私は 2 つの実験を実行しました。それぞれの実験で、10,000 行から 1,000,000 行の間でサイズが増加する 20 個のデータフレームを作成しました。どちらも10列です。
最初の実験では、データセットでフロートのみを使用しました。
これは、行数の関数としてcsvファイルと比較してメモリがどのように増加したかです。(メガバイト単位のサイズ)
2 番目の実験でも同じアプローチを使用しましたが、データセット内のデータは短い文字列のみで構成されていました。
csv のサイズとデータフレームのサイズの関係はかなり異なる可能性があるようですが、メモリ内のサイズは常に 2 ~ 3 倍大きくなります (この実験のフレーム サイズの場合)。
この回答をさらに実験して完成させたいと思います。何か特別なことを試してほしい場合はコメントしてください。
これを逆に行う必要があります。
In [4]: DataFrame(randn(1000000,20)).to_csv('test.csv')
In [5]: !ls -ltr test.csv
-rw-rw-r-- 1 users 399508276 Aug 6 16:55 test.csv
技術的にはメモリはこれについてです(インデックスを含む)
In [16]: df.values.nbytes + df.index.nbytes + df.columns.nbytes
Out[16]: 168000160
したがって、400MB のファイルで 168MB のメモリ、20 個の float 列の 1M 行
DataFrame(randn(1000000,20)).to_hdf('test.h5','df')
!ls -ltr test.h5
-rw-rw-r-- 1 users 168073944 Aug 6 16:57 test.h5
バイナリ HDF5 ファイルとして記述した場合、はるかにコンパクト
In [12]: DataFrame(randn(1000000,20)).to_hdf('test.h5','df',complevel=9,complib='blosc')
In [13]: !ls -ltr test.h5
-rw-rw-r-- 1 users 154727012 Aug 6 16:58 test.h5
データはランダムだったので、圧縮はあまり役に立ちません
はいあります。Pandas は、データをndarray
dtype でグループ化した 2 次元の numpy 構造に格納します。ndarray
基本的には、小さなヘッダーを持つデータの生の C 配列です。dtype
したがって、含まれているのサイズに配列の次元を掛けるだけで、そのサイズを見積もることができます。
np.int32
例: 2 列と 5列の1000 行がある場合np.float64
、DataFrame には 1 つの 2x1000np.int32
配列と 1 つの 5x1000np.float64
配列があります。
4 バイト * 2 * 1000 + 8 バイト * 5 * 1000 = 48000 バイト
配列の sがわかっている場合はdtype
、データを格納するのに必要なバイト数 + Python オブジェクト自体のバイト数を直接計算できます。numpy
配列の便利な属性はですnbytes
。次のようにして、パンダの配列からバイト数を取得できDataFrame
ます
nbytes = sum(block.values.nbytes for block in df.blocks.values())
object
dtype 配列はオブジェクトごとに 8 バイトを格納します (オブジェクト dtype 配列は opaque へのポインターを格納します)。そのため、csv に文字列がある場合は、それらをdtype 配列に変換し、それに応じて計算を調整するPyObject
ことを考慮する必要があります。read_csv
object
編集:
の詳細については、numpy
スカラー型のページを参照してくださいobject
dtype
。参照のみが保存されるため、配列内のオブジェクトのサイズも考慮する必要があります。そのページにあるように、オブジェクト配列は Pythonlist
オブジェクトに多少似ています。