2012-04-30 2 views
4

私は、レンダリングされたチャートを3秒間持っていて、それからそのチャートから何かが加えられるサブチャートを作ることができます。メインチャートから軸をキャッシュして、サブチャートをレンダリングして後で変更できるようにしたいと思います。このエラーをどのように回避できますか?Memcache(Wont Pickle)でMatplotlibをキャッシュする

HERESにサンプルテストコード:

cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

私はこの仕事を得ることができ、とにかくあります:次のエラーを与える

import pylibmc 
cache = pylibmc.Client(["127.0.0.1"], binary=True, behaviors={"tcp_nodelay": True, "ketama": True}) 
import matplotlib.pyplot as plt 


cache_name = 'test' 
fig = plt.figure(figsize=(20, 7)) 
ax = fig.add_axes([0, 0.15, 0.98, 0.85]) 
cache.set(cache_name, ax, 300) 

+1

データ構造は3秒かかりますかmatplotlibで実際のプロットですか?以前はこのことについて議論があり、matplotlibをシリアライズ可能にするという点では何も行われていなかったようです。 – jdi

+0

Matplotlibプロッティング。彼らの燭台のプロットが吸うので、私は個々のバーを使用して燭台のチャートをプロットしています。そして、私はリスト(diff色、値、エラーバー)を使って作業するバーを得ることができないので、私は各バーを個別にループ(約400項目)を追加しています。サンプルスクリプトはこちら:http://pastebin.com/6aD8YZfM。バーの最終セットをキャッシュすることができれば、時間はそれほど重要ではありません。 – NoviceCoding

+0

そのサンプルループでは、軸の作成に時間がかかりますか?そして、それを400回実行すると、3秒かかる軸のコレクションが生成されますか? – jdi

答えて

3

matplotlibフィギュアがシリアル化できるようにするための討議があります。私は、これが対処されている、あるいは目標として受け入れられているという報告は何も見ていない。ですから、memcachedにそれらを送信しようとすると、明らかに失敗するでしょう。検索時に見つかった議論は、現在のmatplotlibの設計がこの目標に容易に応えることができず、内部のリファクタリングが必要であることを示唆しています。参照:http://old.nabble.com/matplotlib-figure-serialization-td28016714.html

実行時間を大幅に短縮するには、データをデータセットに再編成し、ax.bar()を1回だけ呼び出します。その後、データセットをシリアル化して、必要な形式(memcachedなど)で保存できます。

ここでは、アプローチとデータセットを組み合わせたアプローチの間のテストを示すコード例を示します。 https://gist.github.com/2597804

import matplotlib.pyplot as plt 
from random import randint 
from time import time 

DATA = [ 
    (i, randint(5,30), randint(5,30), randint(30,35), randint(1,5)) \ 
    for i in xrange(1, 401) 
] 

def mapValues(group): 
    ind, open_, close, high, low = group 
    if open_ > close: # if open is higher then close 
     height = open_ - close # heigth is drawn at bottom+height 
     bottom = close 
     yerr = (open_ - low, high - open_) 
     color = 'r' # plot as a white barr 
    else: 
     height = close - open_ # heigth is drawn at bottom+height 
     bottom = open_ 
     yerr = (close - low, high - close) 
     color = 'g' # plot as a black bar 

    return (ind, height, bottom, yerr, color) 

# 
# Test 1 
# 
def test1(): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 

    data = map(mapValues, DATA) 

    start = time() 

    for group in data: 

     ind, height, bottom, yerr, color = group 

     ax.bar(left=ind, height=height, bottom=bottom, yerr=zip(yerr), 
       color=color, ecolor='k', zorder=10, 
       error_kw={'barsabove': False, 'zorder': 0, 'capsize': 0}, 
       alpha=1) 

    return time()-start 

# 
# Test 2 
# 
def test2(): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 

    # plotData can be serialized 
    plotData = zip(*map(mapValues, DATA)) 

    ind, height, bottom, yerr, color = plotData 

    start = time() 

    ax.bar(left=ind, height=height, bottom=bottom, yerr=zip(*yerr), 
      color=color, ecolor='k', zorder=10, 
      error_kw={'barsabove': False, 'zorder': 0, 'capsize': 0}, 
      alpha=1) 

    return time()-start 


def doTest(fn): 
    end = fn() 
    print "%s - Sec: %0.3f, ms: %0d" % (fn.__name__, end, end*1000) 



if __name__ == "__main__": 
    doTest(test1) 
    doTest(test2) 

    # plt.show() 

結果::

python plot.py 
test1 - Sec: 1.592, ms: 1592 
test2 - Sec: 0.358, ms: 357 
+0

ありがとうございました。チャートは5sから1.7sへと非常に感謝しました!長期的にはマトプロトリブキャッシング機構を期待しています! – NoviceCoding

-1

documentationを見ると、fig.add_axes()は引数としてタプルをとり、リストを渡しているようです。そのため、Axesオブジェクトは返されません(作成されていないため)Axが関数自体に割り当てられています。

+1

これは正しくありません。さまざまなメソッドは、リストまたはタプルであるシーケンスをとることができます。どちらにしても。 'add_axes()'は 'Axis'オブジェクトを返しています。問題は、OPがAxisインスタンスをmemcachedにワイヤを介して送信しようとしていることです。これは、オブジェクトをシリアル化できるようにしたいということです。 matplotlibオブジェクトは直列化できません。基本的に、軸のさまざまな内部を窒息させます。 'ax .__ dict__'の値を見てみましょう。フィギュアなど、他のmatplotlibオブジェクトの巨大な参照が表示されます – jdi

1

あなたは数字を酸洗化したりunpickle化したりすることができるはずmatplotlibの1.2の時点で、あなたがしたい場合は、より簡単にここでそれを見ることができます。

これは非常に多く、「実験的」な機能ですが、あなたはすべての問題を見つけられた場合、私たちはHTH

MPLメーリングリスト上またはgithub.com/matplotlib/matplotlib

上の問題を提起してお知らせください