Python API が Cassandra のような大規模なデータストアをどのように検索するかを考えようとしています。R、Matlab、および NumPy は、「すべてが行列である」定式化を使用し、各操作を個別に実行する傾向があります。このモデルは、メモリに収まるデータに対して効果的であることが証明されています。ただし、ビッグ データに対する SAS の利点の 1 つは、行ごとに実行し、すべての行の計算を行ってから次の行に移動することです。Cassandra のようなデータストアの場合、このモデルは大きなメリットのように思えます。データを 1 回ループするだけです。
Python では、SAS のアプローチは次のようになります。
with load('datastore') as data:
for row in rows(data):
row.logincome = row.log(income)
row.rich = "Rich" if row.income > 100000 else "Poor"
これは (あまりにも?) 明示的ですが、ループが 1 回だけであるという利点があります。小さいデータセットの場合、コンパイルされたコードを使用して関数がベクトル化されないため、NumPy に比べてパフォーマンスが非常に悪くなります。R/Numpy では、はるかに簡潔でコンパイルされたものになります。
data.logincome = log(data.income)
data.rich = ifelse(data.income > 100000, "Rich", Poor")
log
とifelse
はどちらもベクトルを操作するコンパイル済み関数であるため、これは非常に高速に実行されます。ただし、欠点は、2 回ループすることです。小さなデータセットの場合、これは問題ではありませんが、Cassandra でサポートされているデータストアの場合、このアプローチがどのように機能するかわかりません。
質問: 2 番目の API (R/Numpy/Matlab など) を保持し、計算を遅らせる方法はありますか? おそらく、最後に sync(data) 関数を呼び出すことでしょうか?
別のアイデア?ユーザーは小さな操作に NumPy を使用し、それがどのように機能するかを直感的に把握できるため、NumPy 型の構文を維持するとよいでしょう。