2017-04-18 3 views
2

私は、apache-cassandra-3.10とCassandraCSharpDriverバージョン3.2.1を使用して、Cassandraの概念証明を行っています。
C#で大量のダニデータをカッサンドラに入れたいです。
現在のスキーマは次のようになっています。
CassandraインサートパフォーマンスC#

CREATE TABLE my_keyspace.ticks (
    instrumentcode int, 
    timestamp timestamp, 
    type smallint, 
    exchange smallint, 
    price decimal, 
    volume int, 
    PRIMARY KEY (instrumentcode, timestamp, type, exchange) 
) WITH CLUSTERING ORDER BY (timestamp ASC, type ASC, exchange ASC); 

私は次のように準備されたステートメントを使用しています:

//setup 
Cluster = Cluster.Builder().AddContactPoints("localhost").Build(); 
Session = Cluster.Connect("my_keyspace"); 
ps = Session.Prepare("Insert into ticks (instrumentcode, timestamp, type, exchange, price, volume) values(?,?,?,?,?,?)"); 
//repeated re-using the same prepared statement 
var statement = ps.Bind(tickCassandra.Instrumentcode, tickCassandra.Timestamp, tickCassandra.Type, tickCassandra.Exchange, tickCassandra.Price, tick.Volume); 
var x = Session.Execute(statement); 

をI /秒約600のインサートの挿入のパフォーマンスで立ち往生しています。このコードでは - 私のdevのマシン上で両方( i7)と私のマシン(16コアの獣)のようなプロダクト。
スキーマまたはC#コードのパフォーマンスが向上していますか?それとも、カッサンドラの設定をさらに微調整するだけですか?

+0

私はカサンドラについて何も知らないが、「カサンドラ一括挿入のC#をグーグルサイト:stackoverflow.com "興味深い結果をたくさん生成する – Lanorkin

+0

あなたが挿入するたびにSession.Prepareを使用していますか? –

+0

いいえ - コード例を適宜更新します。 – weismat

答えて

4

は、使用してみてください:

//Execute a statement asynchronously 
session.ExecuteAsync(statement); 

これは、あなたが今持っているものの(3-4回程度)大きな後押しする必要があります。コメントの後に

編集:

また、あなたがPOC段階から自分のアプリを移動した後、再試行および例外処理に注意する必要があります。非常に良いと役立つ例の いくつかあります(xmas79の提案 - !おかげで)

  1. https://stackoverflow.com/a/39643888/6570821
  2. https://stackoverflow.com/a/40524828/6570821
  3. https://stackoverflow.com/a/40794021/6570821
+2

また、何らかのバックプレッシャーを適用し、書き込みタイムアウトを適切に処理することを提案してください。これは遅かれ早かれ発生します。 – xmas79

+0

はい、アプリがpoc段階から外れたら、これもやってください。私に思い出させてくれてありがとう。私はそれがo.kだと思います。私はあなたのコメントを残すだけです。他の誰かがコメントするべきであるようにそれは上にとどまるようにちょうどupvoted。 –

+0

書き込みタイムアウトを適切に処理するための良いコード例はありますか? – weismat

関連する問題