通过Cassandra选择ResultSet改进for循环

时间:2017-05-31 20:02:32

标签: python pandas cassandra cython

在Cython中,我试图从一个有10列的Cassandra表中获取大约600000行。然后我将遍历所有这些。为了测试性能,我在read.pyx

中完成了这项工作
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

for循环的时间是9.449406862258911s。这个数字与纯Python版本没什么不同。

我也尝试通过Pandas DataFrame的形式获得结果,但它变得更糟。许多来源指导我如何改进for循环,将SELECT结果导入DataFrame,并改进迭代DataFrame。但是将它们混合在一起会使代码运行~25s

还有其他方法可以改善这个数字吗?查询应保持不变。

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果你想提高抛出600k行的性能 - 尝试使用批处理/分组,异步调用,分页等... - 你可以使用所有工具并行运行它并提高性能。

如果你想提高这个特定“循环”的性能,我不确定还有很多工作要做 - 大部分时间应该是所有的I / O部分。您可以覆盖行工厂,使用压缩进行传输,使用CL_ONE。

此外,如果您想选择“max”或其他类型的聚合,您可以尝试将逻辑移至Cassandra并使用UDF / UDA。