2017-05-31 12 views
0

Cythonでは、10個のカラムを持つCassandraテーブルから約600000の行をフェッチしようとしています。それから、私はすべてを繰り返します。テストのパフォーマンスのために、ここで私はread.pyxに何をやった:forループ9.449406862258911sでの撮影Cassandraのselect ResultSetを使ってforループを改善する

from cassandra.cluster import Cluster 
import pandas as pd 
import time 

cpdef int get_max_volume(): 
    cluster = Cluster() 
    session = cluster.connect() 
    session.execute("USE trading") 
    rows = session.execute("SELECT * FROM fx WHERE ins='EURUSD' limit 600000") 
    max_vol = 0 
    start = time.time() 
    for i in rows: 
     max_vol = max(max_vol, i.volume) 
    print(max_vol) 
    print(time.time() - start) 
    return max_vol 

時間を。この数は純粋なPythonのバージョンとあまり変わりません。

また、私はPandas DataFrameの形で結果を得ようとしましたが、悪化するだけです。多くの情報源がfor-loopの改善方法を紹介し、SELECTの結果をDataFrameに取り込み、DataFrameを通して反復処理を改善しています。しかしそれらを混在させると、コードは~25sになります。

この番号を改善する他の方法はありますか?クエリは変更しないでください。

ご迷惑をおかけして申し訳ございません。

+0

なぜクエリを変更しないでおく必要がありますか? 10列すべてのデータが必要ですか? – etemple1

+0

私が言ったように、私はforループのパフォーマンスをテストしているので、ここでは単純に1つの列で操作します。後で、分析に他の列を使用することがあります。だからクエリを気にしないでください。もしあなたが本当に知っている必要があれば、私は1つの列をフェッチするときに '〜6秒'を要します。 –

+0

Cython固有ではありませんが、私はiterable 'max(i行のi.volume)で一度呼び出すことで、maxへの呼び出しを最小限に抑えたいと思うでしょう。それとも、SQLでおそらく最大限になるのでしょうか? – DavidW

答えて

0

バッチ/バケット、非同期呼び出し、ページングなどを使用して、600k行を実行するパフォーマンスを向上させたい場合は、並列実行してパフォーマンスを向上させるためのすべてのツールがあります。

この特定の「ループ」のパフォーマンスを向上させたい場合は、多くのことがわかりません。ほとんどの時間はすべてのI/O部分でなければなりません。行ファクトリを上書きしたり、転送に圧縮を使用したり、CL_ONEを使用したりできます。

また、「最大」または他の種類の集約を選択する場合は、論理をCassandraに移動してUDF/UDAを使用することができます。

関連する問題