165

私は疑問に思っていました...たとえば、400MBのcsvファイルをpandasデータフレームに(read_csvまたはread_tableを使用して)読み取っている場合、これに必要なメモリ量を推測する方法はありますか? データフレームとメモリの感覚をつかもうとしているだけです...

4

7 に答える 7

52

議論にもう少しデータを持ち込むと思いました。

この問題について一連のテストを実行しました。

pythonresourceパッケージを使用して、プロセスのメモリ使用量を取得しました。

そして、csv をStringIOバッファーに書き込むことで、そのサイズをバイト単位で簡単に測定できました。

私は 2 つの実験を実行しました。それぞれの実験で、10,000 行から 1,000,000 行の間でサイズが増加する 20 個のデータフレームを作成しました。どちらも10列です。

最初の実験では、データセットでフロートのみを使用しました。

これは、行数の関数としてcsvファイルと比較してメモリがどのように増加したかです。(メガバイト単位のサイズ)

float エントリを持つ行数の関数としてのメガバイト単位のメモリと CSV のサイズ

2 番目の実験でも同じアプローチを使用しましたが、データセット内のデータは短い文字列のみで構成されていました。

文字列エントリを含む行数の関数としてのメガバイト単位のメモリおよび CSV サイズ

csv のサイズとデータフレームのサイズの関係はかなり異なる可能性があるようですが、メモリ内のサイズは常に 2 ~ 3 倍大きくなります (この実験のフレーム サイズの場合)。

この回答をさらに実験して完成させたいと思います。何か特別なことを試してほしい場合はコメントしてください。

于 2015-07-21T15:29:36.647 に答える
32

これを逆に行う必要があります。

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

データはランダムだったので、圧縮はあまり役に立ちません

于 2013-08-06T21:00:08.960 に答える
10

はいあります。Pandas は、データをndarraydtype でグループ化した 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 バイト

于 2013-08-06T20:30:28.387 に答える
10

配列の sがわかっている場合はdtype、データを格納するのに必要なバイト数 + Python オブジェクト自体のバイト数を直接計算できます。numpy配列の便利な属性はですnbytes。次のようにして、パンダの配列からバイト数を取得できDataFrameます

nbytes = sum(block.values.nbytes for block in df.blocks.values())

objectdtype 配列はオブジェクトごとに 8 バイトを格納します (オブジェクト dtype 配列は opaque へのポインターを格納します)。そのため、csv に文字列がある場合は、それらをdtype 配列に変換し、それに応じて計算を調整するPyObjectことを考慮する必要があります。read_csvobject

編集:

の詳細については、numpyスカラー型のページを参照してくださいobject dtype。参照のみが保存されるため、配列内のオブジェクトのサイズも考慮する必要があります。そのページにあるように、オブジェクト配列は Pythonlistオブジェクトに多少似ています。

于 2013-08-06T20:38:29.463 に答える