2

DataFrame をシリアル化し、ネットワーク経由で送信する必要があります。セキュリティ上の理由から、ピクルスは使用できません。

これを行うための次の最速の方法は何でしょうか? v0.13 の msgpacks に興味をそそられましたが、何か間違ったことをしていない限り、パフォーマンスは pickle よりもはるかに悪いようです。

In [107]: from pandas.io.packers import pack

In [108]: df = pd.DataFrame(np.random.rand(1000, 100))

In [109]: %timeit buf = pack(df)
100 loops, best of 3: 15.5 ms per loop

In [110]: import pickle

In [111]: %timeit buf = pickle.dumps(df)
1000 loops, best of 3: 241 µs per loop

これまでに見つけた最良の方法は、array.tostring() を使用して同種の numpy 配列 (df.as_blocks() が便利でした) をシリアル化し、それらから DataFrame を再構築することです。性能はピクルスに匹敵します。

ただし、このアプローチでは、Numpy の fromstring() は dtype=object を逆シリアル化できないため、dtype=object の列 (つまり、少なくとも文字列を含むもの) を完全に文字列に変換する必要があります。ピクルは、オブジェクト列に混合型を保持することに成功しています (ピクル出力に何らかの関数が含まれているようです)。

4

1 に答える 1

6

これは現在、この PR とかなり競争力があります: https://github.com/pydata/pandas/pull/5498 (まもなく 0.13 にマージされます)

In [1]: from pandas.io.packers import pack

In [2]: import cPickle as pkl

In [3]: df = pd.DataFrame(np.random.rand(1000, 100))

上記の例

In [6]: %timeit buf = pack(df)
1000 loops, best of 3: 492 µs per loop

In [7]: %timeit buf = pkl.dumps(df,pkl.HIGHEST_PROTOCOL)
1000 loops, best of 3: 681 µs per loop

はるかに大きなフレーム

In [8]: df = pd.DataFrame(np.random.rand(100000, 100))

In [9]:  %timeit buf = pack(df)
10 loops, best of 3: 192 ms per loop

In [10]: %timeit buf = pkl.dumps(df,pkl.HIGHEST_PROTOCOL)
10 loops, best of 3: 119 ms per loop

別のオプションは、インメモリ hdf ファイルを使用することです

ここを参照してください: http://pytables.github.io/cookbook/inmemory_hdf5_files.html ; pandas では、ドライバー引数を追加するサポートはまだありません (ただし、モンキー パッチを適用するだけで簡単に実行できます)。

別の可能性 a 、 https://github.com/FrancescAlted/carrayctableを参照してください。ただし、pandas ATM ではまだサポートされていません。

于 2013-11-11T20:09:48.807 に答える